我有一个使用匿名函数的代码,我想对其进行测试。该代码遵循以下结构(所有功能都在一个大图中)。但是,当我将匿名函数重构为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:
JS函数是词法闭包。这意味着它们仅关闭在物理上围绕函数定义的函数范围中定义的变量。
f2
引用变量name
,但未在该函数或任何周围的函数中定义它,因此未将其保存在闭包中。与此相比,在匿名函数hello1
和命名函数f1
中hello2
-hello1
和hello2
各自定义一个局部变量name
,并封闭功能,可以参考它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句