我如何得到这个输出?Javascript ES6
请在这里找到我的片段,我如何得到这个输出?Javascript ES6,javascript,function,loops,ecmascript-6,Javascript,Function,Loops,Ecmascript 6,请在这里找到我的片段, for(var i=0;i console.log(i),10); }根案例: for (var i=0;i<11;i++) { setTimeout( console.log(i), 10); } 这将直接给出与ES6相同的结果 正确的方法是使用闭包: (变量i=0;i{ setTimeout(()=>console.log(i),10); })(i) ); }根案例: for (var i=0;i<11;i++) { setTimeout( c
for(var i=0;i console.log(i),10);
}
根案例:
for (var i=0;i<11;i++) {
setTimeout( console.log(i), 10);
}
这将直接给出与ES6相同的结果
正确的方法是使用闭包:
(变量i=0;i{
setTimeout(()=>console.log(i),10);
})(i) );
}根案例:
for (var i=0;i<11;i++) {
setTimeout( console.log(i), 10);
}
这将直接给出与ES6相同的结果
正确的方法是使用闭包:
(变量i=0;i{
setTimeout(()=>console.log(i),10);
})(i) );
}用于(var i=0;i console.log(i),10);
}
为我做参考
推送堆栈超时
我++
推送堆栈超时
我++
。。。当js在执行for循环后有空闲的主“线程”时
推超时10毫秒后,当主“线程”空闲时,将第一个超时推到主“线程”,引用变量的值为11,因为for循环已完成。每次超时都要这样做
可通过以下方式存档预期输出:
for (var i=0;i<11;i++) {
const num = i;
setTimeout(() => console.log(num), 10);
}
for(var i=0;i console.log(num),10);
}
Constnum
将i
的值存储到执行时间。之后,它被垃圾收集。for(var i=0;i console.log(i),10);
}
为我做参考
推送堆栈超时
我++
推送堆栈超时
我++
。。。当js在执行for循环后有空闲的主“线程”时
推超时10毫秒后,当主“线程”空闲时,将第一个超时推到主“线程”,引用变量的值为11,因为for循环已完成。每次超时都要这样做
可通过以下方式存档预期输出:
for (var i=0;i<11;i++) {
const num = i;
setTimeout(() => console.log(num), 10);
}
for(var i=0;i console.log(num),10);
}
Constnum
将i
的值存储到执行时间。然后它被垃圾收集。只有一个i
,当计时器启动时,它的值是11。要扩展@Pointy所说的,setTimeout
是一个异步函数,所以在第一个日志发生时,for循环已经完成运行(它执行i++
,直到i因为变量是引用@Patrickbar,alos解释了为什么它以1开始打印。如果没有setTimeout()然后它将打印0..10,而不是1..11。此外,没有人提到第二个将在不等待的情况下打印数字,setTimeout将接收调用控制台的结果。logThere只有一个i
,当计时器触发时,其值为11。要扩展@Pointy所说的内容,setTimeout
是一个异步函数,因此在发生第一个日志时,for循环已经完成运行(它执行i++
,直到ibecase变量被引用为止)@Patrickbar,alos解释了为什么它开始打印1。如果没有setTimeout(),那么它将打印0..10,而不是1..11。此外,没有人提到第二个会在不等待的情况下打印数字,setTimeout将收到调用console的结果。Log是否尝试执行它?)检查最后一个数字。非常好。它正在返回堆栈。您可以在超时之前执行null&&
您正在调用console.log
,在循环的每次迭代中立即将其返回值传递给setTimeout
,这将是未定义的。不要延迟对console.log的调用。尝试增加setTimeout延迟到更大的值,如10000
,您将看到它并没有延迟任何内容。@JonathanKuhn,对了!抱歉弄错了。Fixed@FieryCat问题是什么?记录的33和44不是来自console.log,它可能是上次setTimeout调用的内部id(setTimeout的返回值)。在控制台中运行代码时,它会自动记录上次调用的函数的返回值。除此之外,它看起来非常好。您是否尝试过执行它?)检查最后一个数字。非常好。它正在返回堆栈。您可以在超时之前执行null&&
您正在调用console.log
,在循环的每次迭代中立即将其返回值传递给setTimeout
,这将是未定义的。不要延迟对console.log的调用。尝试增加setTimeout延迟到更大的值,如10000
,您将看到它并没有延迟任何内容。@JonathanKuhn,对了!抱歉弄错了。Fixed@FieryCat问题是什么?记录的33和44不是来自console.log,它可能是上次setTimeout调用的内部id(setTimeout的返回值)。在控制台中运行代码时,它将自动记录上次调用函数的返回值。除此之外,它看起来非常好。鉴于问题明确询问ES6,不,这不是解决方案。Hm..setTimeout(console.log(i),10);
-console.log将在setTimeout之外执行。就是这样……我已经更新了答案否,这不是我的意思。我的意思是你不应该在ES6中使用IIFEs引入作用域。@Bergi,在这种情况下,你有什么建议?这是一个相当常见的解决方案:如果问题明确地询问ES6,不,这不是解决方案。嗯setTimeout(console.log(i),10);
-console.log将在setTimeout之外执行。就是这样……我已经更新了答案no,这不是我的意思。我的意思是你不应该在ES6中使用IIFEs来引入作用域。@Bergi,在这种情况下你有什么建议吗?这是相当常见的解决方案: