美文网首页JavaScript < ES5、ES6、ES7、… >
for循环中var或let和异步的使用

for循环中var或let和异步的使用

作者: sweetBoy_9126 | 来源:发表于2019-02-14 22:56 被阅读14次
    1. 在for循环中使用var
    for(var i = 0;i<2;i++){
      setTimeout(()=>{console.log(i)})
    }
    

    上面的代码输出两个2,原因是for循环属于同步,setTimeout属于异步,同步代码执行完才会去执行异步,也就是上面代码每次循环都会项任务队列里加一个定时器,等for循环结束后开始执行,这时候的i是2,所以会打印出两个2。在for循环中用var就是一个全局的i,所以每次会被后面的给替换

    1. 在for循环中使用let
    for(let i = 0;i<2;i++){
      setTimeout(()=>{console.log(i)})
    }
    

    2中的代码最后打印出的是0,1。因为for循环中使用let循环几次就会生成几个i,也就是说在每次进入循环的时候都会把之前的i赋值给一个新的i

    1. 在for的表达式中使用异步
      需要提前说明的知识
    let i = 0,1
    //等价于
    let i = (0,1)
    

    上面的代码结果都是1,对于逗号表达式如果你有一连串的操作,那么这个表达式的值就是最后一个

    典型例题

    for(let i = (setTimeout(()=>{console.log(i)},233),0);
        i<2;
        i++
    ){
        console.log(i)
    }
    

    上面的setTimeout里的i又是什么?
    答:0;
    解释:
    2中说了每次进入循环前都会生成一个新的i,这个i就是在初始化表达式后,条件表达式前生成的,也就是说在判断这个i的值之前就已经生成了一个新的i了,这个新的i要不就是初始值要不就是上一次循环的i的值,再次以2中的代码来解释,就相当于

    for(let i = 0;let i = _i, i<2;i++){
    setTimeout(()=>{console.log(i)})
    }
    上面的代码,一开始i=0,然后把这个0赋值给一个新的i,再去判断i是否小于2,如果小于2就进入循环,得到0,然后把这个0进行++得到一个1,再次把这个1赋值给一个新的i,判断是否小于2,小于2进入循环得到1,然后1在++得到一个2,把这个2赋值给一个新的i,这个时候不小于2退出循环
    所以这个典型例题里面的初始化表达式的i跟后面的i没有关系,只是它的值会复制给后面的i,所以最后还是0

    相关文章

      网友评论

        本文标题:for循环中var或let和异步的使用

        本文链接:https://www.haomeiwen.com/subject/cloyeqtx.html