我对费用变量绑定有些困惑

时间:2014-04-03 23:42:05

标签: javascript scope

我已经阅读了一些有关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?

由于

2 个答案:

答案 0 :(得分:1)

你不能这样做,因为var声明了一个局部变量,只在声明它的函数范围内可见。

funcB的正文中的任何内容都没有看到funcA正文中的内容,你必须明确(传递参数),或在funcB内声明funcA x关闭funcB(关闭)。

所以你可以做的是让xvar 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不能(也不应该)了解其他功能的词汇环境,因为它不能(也不应该)知道是否会从这些功能中调用它 - 或不。