为什么我不能在封闭函数之外重构这个匿名函数?

时间:2013-07-06 02:58:32

标签: javascript closures

我有一个代码,它使用我想测试的匿名函数。代码遵循以下结构(所有函数都在大图中)。但是,当我将匿名函数重构为更大函数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: 

2 个答案:

答案 0 :(得分:3)

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

f2引用变量name,但它没有在该函数或任何周围函数中定义,因此它不会保存在闭包中。将其与hello1中的匿名函数和f1中的命名函数hello2进行比较 - hello1hello2各自定义一个局部变量name ,附带的功能可以参考它。

答案 1 :(得分:1)

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