我正在尝试理解JavaScript的作用域规则。我在教材和文档中读到的让我感到困惑。
在我看来,JavaScript是一种静态(或词法)作用域语言 - 在尝试将变量名绑定到变量(定义)时,使用代码的词法结构。
执行上下文似乎类似于调用栈上的堆栈帧。每个执行上下文都有一个变量对象,其中定义了所有本地变量(相关函数的)。这些变量对象链接在一起,从堆栈顶部的变量对象到堆栈底部的变量对象(窗口对象)提供“作用域链”。在将变量名绑定到变量时,会从上到下搜索此作用域链。这与C / C++ / Java等静态作用域语言非常相似。
有一个重要差异涉及C / C++ / Java -- 可以访问在不再存在于调用栈上的函数中定义的变量,如下面的示例所示:
我理解得对吗?我还需要注意哪些问题?
提前感谢。
在我看来,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"
我理解得对吗?我还需要注意哪些问题?
提前感谢。
printColor
的函数即使在函数终止后也可以访问changeColor
中定义的所有变量。我不知道C语言中是怎样的。 - Felix Kling