Syntax Parser
có một parser giữa code và computer để translate code cho computer hiểu và chạy Execution Context
ví dụ, khi chạy JS trên một tab Chrome, dù là JS rỗng (không có đoạn code nào), thì Lexical Environment
thứ tự các dòng code có ảnh hưởng đến cách JS chạy name / value pair
nhưng chỉ nhận giá trị 1 lần giá trị có thể là những name / value pair khác object
collection of name / value pair // name / value
address: '64 Yen Do'
// object
address: {
street: 'Yen Do',
number: 64,
district: {
name: 'Binh Thanh',
ward: 17
}
}
global environment & global object
global environment: là execution environment (global) đầu tiên mà JS khởi chạy
cho dù không có đoạn code nào, thì trong môi trường global environment, JS cũng sẽ tự khởi tạo 2 thứ: ở tầm global thì this = window (this ở đây có thể là window của Chrome, hoặc máy chủ của NodeJS) global = “not inside a function”
var a = 'hello'
function b() {}
a thuộc gloval var
a cũng thuộc global object
truy cập a bằng nhiều cách
a
window.a
this.a
Called b
undefined
# undefined = var a (I've not set value for a)
# uncaught errror = no a (there is no a at all in the code)
Execution Context bao gồm 2 phase:
creation phase: giữ chỗ cho biến (tất cả là ‘undefined’) và hàm vào bộ nhớ Javascript is single-threaded and synchronous
thứ tự các function:
creation: a(), b(), d (underfined); variable environment
tùy vào vị trí đứng của var lúc đó ở đâu # global context
myVar = 1
# a() context
myVar = 2
# b() context
myVar = undefined
# back to global context
myVar = 1
the scope chain
outer environment = outside where the function is written, NOT where the function is called. vị trí hàm được viết, chứ không phải vị trí hàm được gọi JS sẽ ưu tiên các biến BÊN TRONG hàm, nếu không có mới tìm bên ngoài (outer environment) # vì outer environment của b() là global chứ không phải a()
myVar = 1
# b() lúc này đã nằm trong execution context của a(), nên outer environment của b() là a()
myVar = 2
myVar = 2
uncaught error: b is not defined
# bởi vì chưa từng có hàm b() được setup ở global environment
# không có myVar trong scope của a() lẫn b(), nên JS sẽ tiếp tục tìm bên ngoài nữa, là global
myVar = 1
what about asynchronous & callback?
tất cả event nằm ngoài JS Engine đều phải xếp hàng đợi thực thi sau # kết quả console.log
finished function (still wait 3s)
finished execution
click event!
# nghĩa là click handler chỉ thực thi SAU khi các JS chính đã chạy xong
function a() hoặc b() setup xong
function chạy xong
global chạy xong
mới đến click handler / event queue