关于功能:如何获得此输出? Javascript ES6

How am getting this output ? Javascript ES6

本问题已经有最佳答案,请猛点这里访问。

请在这里找到我的代码段,

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

如何打印11 11次? 因为i设定为<11?

如果我没有功能它控制它打印1-10。

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

这给了我1-10。 我很奇怪如果我包括没有条件的功能它会如何改变?


根案例:

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

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

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

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

正确的方法是使用闭包:

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

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

另外它可以用let

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


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

    ...当执行for循环后,js有自由主"线程"

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

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

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

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