我有一个使用匿名函数的代码,我想测试它。代码遵循以下结构(所有函数都在一个大映射中)。但是,当我将匿名函数重构为较大函数 hello3
之外的单独函数 f2
时,正如我所期望的那样,该值不会被传递。为什么会这样呢?
我可以将值作为参数传递,但我也想了解基本原理。
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:
最佳答案
JS 函数是词法闭包。这意味着它们仅关闭在物理上围绕函数定义的函数作用域中定义的变量。
f2
引用变量 name
,但它没有在该函数或任何周围函数中定义,因此它不会保存在闭包中。将其与 hello1
中的匿名函数和 hello2
中的命名函数 f1
进行比较 - hello1
和 hello2
各定义一个局部变量name
,内含的函数可以引用它。
关于javascript - 为什么我不能在封闭函数之外重构这个匿名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17499240/