在昨天內容中可以知道,JavaScript 採用了靜態作用域
,函式在定義時就已經確定作用域,而在產生作用域後,會產生 執行環境
,並依照 執行堆疊
的方式依序執行程式碼,那什麼是 執行環境
與 執行堆疊
呢?說明如下:
執行環境
是指程式在執行時所產生的環境
window
或 global
) - 開啟瀏覽器會產生 window 變數
,而開啟後端 Node.js 則會產生 global 變數
this
,此時的 this
指向 window
或 global
,要注意的是 this
的值會隨著 執行環境
而改變在函式運行時會產生函式的執行環境,以及產生函式內的變數,反之,若還沒呼叫函式是不會有函式的執行環境,也不會產生函式內的變數。
執行環境
是一層一層建立並堆疊執行,最上層是正在執行的環境,當運作完成後則會一層一層離開,這就是所謂的 執行堆疊
,而 執行堆疊
與什麼時候定義函式沒有關係,它與呼叫的位置有關。
在還未呼叫 函式 fn2
前,沒有函式 fn1
與 函式 fn2
的執行環境。
function fn1(people) {
var sayHello = '早安';
return `${people} ${sayHello}!`;
}
function fn2() {
var people = '媽媽';
console.log('1:', fn1(people));
// 1: 媽媽 早安!
}
fn2();
利用 for 迴圈重複呼叫函式,會不斷產生新的執行環境
function fn1(num) {
console.log(`第 ${num} 名!`);
}
function fn2() {
fn1(1);
// 第 1 名!
for(var i=2; i<4; i++) {
fn1(i);
}
// 第 2 名!
// 第 3 名!
}
fn2();
圖片待補