我试图从实际场景中理解javascript闭包。我从理论的角度来看,在闭包的帮助下,内部函数可以访问封闭函数中的变量,即父函数。
我也在stackOverflow上阅读了几个问题。
我真的很想念这里发生的事情吗?
1f
这给了我一个10.大多数文章说,当它到达内部匿名函数时,for循环正在执行,因此循环中出现的最后一个值10正在打印
但我仍然无法深究这一点。
相反,如果我使用类似的东西:
var foo = [];
for(var i=0;i<10;i++){
foo[i] = function(){
return i;
}
}
console.log(foo[0]());
我正在获得输出。非常感谢任何帮助。
答案 0 :(得分:2)
在第一个场景中,添加到foo
数组的所有函数都引用相同的var i
。所有函数都将返回i
设置为last的任何内容,即10
,因为在循环的最后一次迭代期间,它的值被设置为。
在第二个场景中,您正在立即调用此函数:
(function(){
var y =i;
foo[i] = function(){
return y;
}
})();
通过立即调用它,您可以有效地锁定本地状态var y
,对于循环的每次迭代 - 它为添加到数组的每个函数提供唯一的范围。
答案 1 :(得分:2)
也许这个代码块有帮助
var foo = [];
for(var i = 0; i < 10; i++) {
foo[i] = function() {
return i; // is a reference and will always be the value, which 'i' have on function execution
}
}
// 'i' is 10 here!
console.log(foo[0]()); // executing the function will return the current value of 'i'
///////////////////////////////////////
var foo = [];
for(var i=0;i<10;i++) {
/* thats a IIFE (immediately invoked function expression) */
(function(a) { // 'a' is now a local variable
foo[a] = function() { // defines a function
return a; // is a reference to local variable 'a'
};
})(i); // <- passing the current value of i as parameter to the invoked function
}
// 'i' is 10 here
console.log(foo[0]()); // returns the reference to 'a' within the same scope, where the function was defined