关于我在Chrome控制台中运行的以下代码,我有几个问题(我强调了每个循环之间的区别)。代码的目的是立即打印出偶数数字,然后按顺序打印出奇数(因为堆栈是清晰的,Chrome开始在事件队列中运行,根据我的理解)。
对于第一个循环,为什么会显示undefined
?为什么<·
左侧有小undefined
?
对于第二个循环,为什么1
会打印它的位置?看起来这是控制台正在做的事情,而不是我的代码。
对于第二个循环,为什么2
打印出来? for循环严格小于2.
为什么第三个循环打印undefined
和3
?控制台实际上没有打印<·
符号旁边的数字有什么不同?
对于最后一个循环,为什么没有打印1
和3
?好像有点打印4
3次。
如何以这种方式使用setTimeout完成代码的意图?
如果您自己尝试使用代码,则每次运行循环时,<·
旁边的数字似乎会递增。
答案 0 :(得分:2)
您需要使用Immediately Invoked Function Expression(IIFE)绑定i
的当前值
示例:
for( var i = 0 ; i < 5 ; i++) {
if(i % 2 == 0) {
console.log(i);
} else {
(function(_i) {
setTimeout(function() { console.log(_i); }, 0);
})(i);
}
}
答案 1 :(得分:2)
对于第一个循环,为什么它显示未定义?为什么undefined左边有小
<·
?
<-
表示返回值。代码不会返回任何内容。
对于第二个循环,为什么1打印它的位置?看起来这是控制台正在做的事情,而不是我的代码。
在这里,代码确实返回了一些内容:1
。这是setTimeout
的ID。
对于第二个循环,为什么2打印出来? for循环严格小于2。
请参阅JavaScript closure inside loops – simple practical example - 在代码运行时,i
现在为2。
为什么第三个循环打印未定义且3?有什么不同,控制台实际上没有打印出&lt;·符号旁边的数字?
undefined
是循环返回的最后一个值 - console.log()
的值。超时记录3
。
对于最后一个循环,为什么没有打印1和3?好像它打印了4次3次。
如何以这种方式使用setTimeout完成代码的意图?
再次查看JavaScript closure inside loops – simple practical example。