所以我正在阅读关于javascript中执行上下文的blog。之后,我尝试了解典型的闭包/ EC示例:
function foo() {
var foos = [];
for(var i = 0; i < 3; i++) {
foos.push(function() {
alert(i);
});
}
return foos;
}
var foos = foo();
foos[0]();
foos[1]();
foos[2]();
//All alert 3
我认为,如果我理解正确,i
因为闭包而为3。在函数执行时,它们将在foo
范围内的当前范围之外查找变量i,并且当它们被执行时它们发现它是3。
然后我以这种方式修复它:
http://jsfiddle.net/s3kpmz33/2/
function foo() {
var foos = [];
for(var i = 0; i < 3; i++) {
(function bar(k) {
foos.push(function _bar() {
alert(k);
})
})(i);
}
return foos;
}
var foos = foo();
foos[0]();
foos[1]();
foos[2]();
//Correctly alert 0, 1, 2
现在,我认为这背后的原因是因为每个_bar
函数现在都查看bar
函数范围,并且因为这是一个生命,或任何将使用该值执行的函数我想要(以前声明的函数,例如@Quentin指出),它们都创建了i
值的OWN本地副本,并将其分配给局部变量k
。
我的假设是否正确?我意识到我可能没有非常清楚地解释它,因为我觉得我不太了解它。如果我在推理中犯了错误,请纠正我。
如果你能用更简单的词语改进我的推理,那么我和那些来这里寻找答案的同事们也会非常感激。
答案 0 :(得分:3)
因为这是一个生命
它不需要是IIFE。您可以改为调用先前声明的函数。
function alerter_factory(value_to_alert) {
return function() {
alert(value_to_alert);
}
}
function foo() {
var foos = [];
for (var i = 0; i < 3; i++) {
foos.push(alerter_factory(i));
}
return foos;
}
var foos = foo();
foos[0]();
foos[1]();
foos[2]();
他们都创建了自己的OWN本地副本,并将其分配给局部变量k。
关闭。
他们拥有自己的值的本地副本,i
已分配给本地k
变量。