美文网首页
JS函数执行时机

JS函数执行时机

作者: Adder | 来源:发表于2020-12-17 22:16 被阅读0次

    请问下面这段代码会打印什么结果

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

    打印出6 个6
    解析:
    因为i作用域,不属于 for 循环体,属于 global;等到for循环体结束,i已经等于6了,这个时候再执行setTimeout的6个回调函数,里面的i去向上找作用域,只能找到global下的 i,就是6

    解决办法,人为给console.log(i)创造作用域,保存i的值

    解决方案一

    let

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

    let作为代码块的作用域,每次for循环拿的都是for代码块作用域下的i;就能得到 0,1,2,3,4,5,

    setTimeout 延时 delay 毫秒之后,啥也不管,直接将回调函数加入事件队列。

    解决方案二

    立即执行函数

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

    这样console.log(i) 中的i就保存在每一次循环生成的立刻执行函数中的作用域里了

    相关文章

      网友评论

          本文标题:JS函数执行时机

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