當我們在討論程式碼的詞彙環境時,我們在意的其實是:
它被寫在哪裡? 它的周圍環境是什麼?
在瀏覽器上運作的 js 程式,全域環境會是 window
, this
也會指向 window
。
另開一個分頁,會有一個新的 window
與指向它的 this
,因為一個視窗會有一個全域物件。
執行環境會分兩階段創造, 第一階段是創造(creation)階段,
第二階段是執行階段。
程式碼中有許多指令, 一次只會執行一行。
JavaScript 是單執行序, 但瀏覽器中並非只有 JavaScript 在執行, 所以其他程序並不一定是單執行序
程式碼一次執行一行, 並且依照順序。
stack => 後進先出
function b)(){
var myVar;
console.log(myVar);
}
function a(){
var myVar = 2;
console.log(myVar);
b();
}
var myVar = 1;
console.log(myVar);
a();
// the result
//
// 1
// 2
// undefined
function b(){
console.log(myVar);
}
function a(){
var myVar = 2;
b();
}
var myVar = 1;
a();
// the result:
// 1
scope chain 與 execution context 不一樣。
在當前 execution context 中找不到的變數,JavaScript 引擎會順著 scope chain 繼續往下找,但往下找的地方並不是看 execution stack,而是看 lexical environment.
https://i.imgur.com/JUdFXma.png
JavaScript 不是瀏覽器中的唯一引擎,JavaScript Engine 運作的同時,瀏覽器中的其中機制也在運作。
當 execution stack 是空的時候,JavaScript 才會注意到 event queue,也就是說要等 execution stack 跑完才會執行 event queue 相對應的 handler function.
JavaScript 是同步的方式在處理非同步請求。