我想知道这段代码是怎么执行的以及一次性定时器的特点var i=0; for(i=0;i<3;i++){ console.log(i) setTimeout(function() { return function() { console.log(i) } }(),0) }
1 回答
李晓健
TA贡献1036条经验 获得超461个赞
这段代码会输出 1 2 3 3 3 3 ,前面输出的 1 2 3,就是for循环里面直接输出的结果。然后来说说这个定时器里的东西:这个setTimeout里你第一个参数传的是一个立即执行函数,也就是说当js解析器读到这段代码时就会立即执行,而你这个function里又会返回一个函数,所以
setTimeout(function() { return function() { console.log(i) } }(),0) //就相当于 setTimeout(function() { console.log(i) },0)
这两种写法效果是一样的。然后你第二个参数是0,大概意思也就是让定时立即执行,但是js是单线程执行的,定时器又会被加入到执行队列的最后,即使你给的定时时间是0,他也会等到主线程的东西执行完,再来执行,for又是同步执行,他在主线程里,所以setTimeout里面的内容就要等到for循环执行完才能执行,当for循环执行完的时候,i就已经是3了,for循环里的定时函数也需要执行3次,所以后面就连着3个3,并且地for循环里的1 2 3 输出之后才输出。
如果你的问题已解决,请记得采纳答案!
添加回答
举报
0/150
提交
取消