我想了解JavaScript作用域規則。我在教科書和文檔中讀到的內容令人困惑。JavaScript範圍和執行上下文
在我看來,JavaScript是一種靜態(或詞法)範圍的語言 - 當試圖將變量名綁定到變量(定義)時,將使用代碼的詞法結構。
執行上下文似乎與調用堆棧上的堆棧幀相似。每個執行上下文都有一個變量對象,其上定義了所有局部變量(關聯函數的)。這些變量對象被鏈接在一起,從堆棧頂部的變量對象到堆棧底部的變量對象(窗口對象)提供一個'範圍鏈'。通過將變量名稱綁定到變量,從上到下搜索此作用域鏈。這與靜態範圍的語言(如C/C++/Java)非常相似。
C/C++/Java似乎有一個重要區別 - 可以訪問一個函數中定義的變量,該變量的棧幀不再位於調用棧中,如下例所示:
var color = "red";
var printColor;
function changeColor() {
var color = "green";
printColor = function(msg) {
alert(msg + color);
}
printColor("in changeColor context, color = "); // "green"
}
changeColor();
// stack frame for "changeColor" no longer on stack
// but we can access the value of the variable color defined in that function
printColor("in global context, color = "); // "green"
我有這個權利嗎?我應該注意到其他問題嗎?
預先感謝
非常透徹後命中HN今天倒是這樣:[什麼是執行上下文和堆棧在JavaScript?](http://davidshariff.com/blog/what-is-the-execution-context-in- javascript /) –
這被稱爲*閉包*。您分配給'printColor'的函數即使在函數終止後也可以訪問'changeColor'中定義的所有變量。我不知道這是怎麼在C –
幾乎@FelixKling。但changeColor也是在全局範圍上定義的,因此它的範圍將永遠不會被垃圾收集。 – webduvet