【问题标题】:Confused about function closures对函数闭包感到困惑
【发布时间】:2017-11-24 12:37:04
【问题描述】:

有人可以解释为什么控制台注销 10、10、10 而不是 9、9、9 吗? 当它通过for循环时,它不应该在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]());

【问题讨论】:

  • 当 foo 被执行时,i 已经达到 10,courtey i++
  • i++ 在每个循环结束时进行评估。因此,必须为 10 才能使下一个循环不执行(因为条件是 i &lt; 10)。
  • 您的主要困惑似乎不是闭包,而是for 循环的工作方式。
  • @JLRishe 确实......然而,OP 接受了一个没有解释问题的答案!

标签: javascript function loops for-loop closures


【解决方案1】:

每当执行使用父作用域中的任何变量的任何function 时,它都会获取它在执行function 时所持有的变量的值。在您的情况下,由于i++i 在执行时已经到达10

为了得到预期的结果,你可以给它添加IIFE,它会在它的范围内保存i的值。

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]());

【讨论】:

  • OP 的预期结果是 9,9,9,所以这不会产生他们的预期结果。
【解决方案2】:

您可以使用这种保留上下文的语法

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/

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多