应该是闭包的问题吧

我想知道这段代码是怎么执行的

以及一次性定时器的特点

var i=0;
for(i=0;i<3;i++){
    console.log(i)
    setTimeout(function() {
        return function() {
            console.log(i)
        }
    }(),0)
}

二露
浏览 1187回答 1
1回答

李晓健

这段代码会输出 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 输出之后才输出。如果你的问题已解决,请记得采纳答案!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript