请在此处找到我的代码段,
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。我很想知道如果我包含没有条件的函数会如何改变它?
答案 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);
}
i ++在
...当执行for循环后,js有free主“thread”
推送超时后10 ms并且当主“线程”空闲时 - 将第一个超时推送到主“线程”,引用变量的值为11,因为for循环已完成。每次超时都要这样做。
预期的输出可以通过以下方式存档:
for (var i=0;i<11;i++) {
const num = i;
setTimeout(() => console.log(num), 10);
}
Const num
将i
的值存储到执行时。之后,它被垃圾收集。