我已经阅读了一些有关JS范围的指南,但我不太明白这里发生了什么。
此 工作:
var b = 6;
function a(){
alert(b);
}
a(); //alerts 6
然而,这使得Firebug说“x未定义”
var funcB = function(){
alert(x);
}
function funcA(anonymous){
var x = 10;
anonymous();
}
funcA(funcB);
那么为什么funcB中的free x变量没有绑定到funcA第一行声明为10的x?
由于
答案 0 :(得分:1)
你不能这样做,因为var
声明了一个局部变量,只在声明它的函数范围内可见。
funcB
的正文中的任何内容都没有看到funcA
正文中的内容,你必须明确(传递参数),或在funcB
内声明funcA
x
关闭funcB
(关闭)。
所以你可以做的是让x
以var funcB = function(x) {
alert(x);
};
function funcA(fn) {
var x = 10;
fn(x);
}
funcA(funcB);
为参数:
{{1}}
答案 1 :(得分:1)
JavaScript中的每个函数都有自己的Lexical Environment
:在其中使用的标识符(名称)之间的映射,以及存在(在外部作用域中)或将在作用域内创建的特定变量(和函数)这个功能。
关键点在于定义此函数时创建给定函数的词法环境 - 而不是在执行该函数时。
在您的第二个示例中,x
中提到的 name funcB
没有任何要映射的内容 - 没有名为{{1的变量在其自己的范围或父(外部)范围。与第一个示例不同,x
可以映射到名为b
的局部变量,生活在同一范围函数b
中。
当然,a
不能(也不应该)了解其他功能的词汇环境,因为它不能(也不应该)知道是否会从这些功能中调用它 - 或不。