2

我有一个使用我想测试的匿名函数的代码。代码遵循以下结构(所有功能都在一个大地图中)。f2但是,当我将匿名函数重构为更大函数之外的单独函数时hello3,值不会像我预期的那样传递。为什么会这样?我可以将值作为参数传递,但我也想了解基本原理。

var bigMap = {
f2: function() {
    console.log("Closed over:" + name);
},

hello1: function(name) {
     return function() {
        console.log("Closed over:" + name);
    };
},

hello2:function(name) {
    var f1 = function() {
        console.log("Closed over:" + name);
    };
    return f1;
},


hello3:function(name) {
    return this.f2;
}
};

var f = bigMap.hello1("asad");
f(); // Outputs> Closed over:asad
f = bigMap.hello2("asad");
f(); // Outputs> Closed over:asad
f = bigMap.hello3   ("asad");
f(); // Outputs> Closed over: 
4

2 回答 2

3

JS 函数是词法闭包。这意味着它们只关闭在物理上围绕函数定义的函数范围中定义的变量。

f2指的是变量name,但它没有在该函数或任何周围的函数中定义,因此它没有保存在闭包中。将其与 -- 中的匿名函数hello1和命名函数f1进行比较hello2hello1并且hello2每个都定义了一个局部变量name,并且封闭的函数可以引用它。

于 2013-07-06T03:17:40.510 回答
1

这与可测试性无关,而只是常规的 js 变量范围。您不能在任何地方引用裸词 f2,因为它是对象“bigMap”的属性。换句话说,如果你只是将'return f2'更改为'return bigMap.f2',它将返回函数f2。

于 2013-07-06T03:07:03.963 回答