为了账号安全,请及时绑定邮箱和手机立即绑定

应该是闭包的问题吧

应该是闭包的问题吧

二露 2017-07-16 21:00:41
我想知道这段代码是怎么执行的以及一次性定时器的特点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 输出之后才输出。



如果你的问题已解决,请记得采纳答案!


查看完整回答
1 反对 回复 2017-07-17
  • 二露
    二露
    你好,谢谢你的回答
  • 二露
    二露
    你能帮我在看看 for(var i=0;i++<3;){ }; 这里的for循环小括号里的含义吗? 我在for循环外面也能打印出i的值,它是全局变量吗
  • 二露
    二露
    我就是给上面的那个问题修改了以下for循环
点击展开后面2
  • 1 回答
  • 0 关注
  • 1154 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信