怎么得到这个输出? Javascript ES6

时间:2017-06-21 18:16:22

标签: javascript function loops ecmascript-6

请在此处找到我的代码段,

for (var i=0;i<11;i++) {
  setTimeout( () => console.log(i), 10);
}

如何打印11 11次?自i设置以来&lt; 11?

如果我在没有功能的情况下安装它,则打印1-10。

for (var i=0;i<11;i++) {
  setTimeout( console.log(i), 10);
}

这给了我1-10。我很想知道如果我包含没有条件的函数会如何改变它?

2 个答案:

答案 0 :(得分:2)

根案例:

for (var i=0;i<11;i++) {
  setTimeout( console.log(i), 10);
}

console.log将直接触发(没有任何延迟),因此它应该是:

for (var i=0;i<11;i++) {
  setTimeout(function () { console.log(i); }, 10);
}

将直接给出与ES6相同的结果

正确的方法是使用闭包:

for (var i=0;i<11;i++) {
    ((i) => { 
        setTimeout(() => console.log(i), 10);
    })(i);
}

我们在JavaScript中使用单线程模型的原因。因此,所有setTimeout将在 for - 周期后执行

此外,它可以使用let

for (let i=1; i<=11; i++) {
    setTimeout(() => console.log(i), 10);
}

答案 1 :(得分:1)

for (var i=0;i<11;i++) {
  setTimeout( () => console.log(i), 10);
}
  1. 为i
  2. 做参考
  3. 推送堆栈超时
  4. 我+ +
  5. 推送堆栈超时
  6. i ++在

    ...当执行for循环后,js有free主“thread”

    推送超时后10 ms并且当主“线程”空闲时 - 将第一个超时推送到主“线程”,引用变量的值为11,因为for循环已完成。每次超时都要这样做。

  7. 预期的输出可以通过以下方式存档:

    for (var i=0;i<11;i++) {
      const num = i;
      setTimeout(() => console.log(num), 10);
    }
    

    Const numi的值存储到执行时。之后,它被垃圾收集。