对功能关闭感到困惑

时间:2017-11-24 12:37:04

标签: javascript function loops for-loop closures

有人可以解释为什么它控制台退出10,10,10而不是9,9,9? 当它经过循环时,不应该停在9?

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

console.log(foo[0]());
console.log(foo[1]());
console.log(foo[2]());

2 个答案:

答案 0 :(得分:3)

每当执行使用来自父作用域的任何变量的任何function时,它将获得在function执行时保留的变量的值。在您的情况下,由于i10在执行时已经到达i++

要获得预期结果,您可以向其添加IIFE,其范围内将保留i的值。

&#13;
&#13;
var foo = [];
for (var i = 0; i < 10; i++) {
  foo[i] = (function(i) {
    return function() {
      return i;
    };
  })(i);
};

console.log(foo[0]());
console.log(foo[1]());
console.log(foo[2]());
&#13;
&#13;
&#13;

答案 1 :(得分:-1)

您可以使用此语法来保留上下文

for (let i = 0; i < 10; i++) {
  foo[i] = () =>  i;
};

console.log(foo[0]());
console.log(foo[1]());
console.log(foo[2]());

https://jsfiddle.net/bandpay/8zat3bnn/