我有一个代码,它使用我想测试的匿名函数。代码遵循以下结构(所有函数都在大图中)。但是,当我将匿名函数重构为更大函数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:
答案 0 :(得分:3)
JS函数是词法闭包。这意味着它们只关闭在函数范围内定义的函数范围中定义的变量。
f2
引用变量name
,但它没有在该函数或任何周围函数中定义,因此它不会保存在闭包中。将其与hello1
中的匿名函数和f1
中的命名函数hello2
进行比较 - hello1
和hello2
各自定义一个局部变量name
,附带的功能可以参考它。
答案 1 :(得分:1)
这与可测试性无关,只与常规js变量范围有关。你不能在任何地方引用单词f2,因为它是对象'bigMap'的属性。换句话说,如果你只是将'return f2'更改为'return bigMap.f2',它将返回函数f2。