通过一个小例子来理解JavaScript闭包

时间:2017-01-28 21:35:32

标签: javascript closures

我试图从实际场景中理解javascript闭包。我从理论的角度来看,在闭包的帮助下,内部函数可以访问封闭函数中的变量,即父函数。

我也在stackOverflow上阅读了几个问题。

我真的很想念这里发生的事情吗?

1f

这给了我一个10.大多数文章说,当它到达内部匿名函数时,for循环正在执行,因此循环中出现的最后一个值10正在打印

但我仍然无法深究这一点。

相反,如果我使用类似的东西:

var foo = [];
for(var i=0;i<10;i++){
  foo[i] = function(){
  return i;
}  
}
console.log(foo[0]());

我正在获得输出。非常感谢任何帮助。

2 个答案:

答案 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