我试图理解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"
难道我得到这个权利? 是否有其他问题,我应该知道的?
提前致谢