美文网首页
面试题for循环与setTimeout的使用问题

面试题for循环与setTimeout的使用问题

作者: 代码使劲儿搬 | 来源:发表于2019-07-09 19:34 被阅读0次
    之前在面试前端时遇到一道for循环与setTimeout的案例题
    for(var i=0; i<10; i++){
        setTimeout(function(){
            console.log(i);
        }, 0)
    }
    //输出的是什么?为什么是这样的?如何解决?
    

    结果:输出了 10个10.

    由于才疏学浅当时就蒙圈了,后来回来查阅了一下大佬们的解释,还是弄清了点原因道理的.
    问题出现在作用域上,用为console.log(i);中的i是var 定义的,所以是函数级的作用域.不属于for循环体,for 循环完时候正在执行setTimeout的10个回调函数.
    事件机制:
    js是单线程的,它有一个队列的运行机制,setTimeout会把回调的函数放入事件队列当中排队执行.
    setTimeout会在延时设定的毫秒之后,啥也不管直接将回调函数放入队列当中

    因为这时的for循环完之后此时i的值已为10.在js里,同步优先于异步优先于回调,这时10个setTimeout的回调函数全部塞入到事件队列中等待执行,for循环完成之后被遗弃执行了.

    解决方法: 给console.log(i)创造作用域,保存i的值
    for(var i=0; i<10; i++){
            (function(i){
                setTimeout(function(){
                      console.log(i);
                     }, 0)
              })(i)
            } //  输出0123456789
    

    这里用到了立即执行函数,这样 console.log(i);中的i就保存在每一次循环生成的立即执行函数当中了.

    相关文章

      网友评论

          本文标题:面试题for循环与setTimeout的使用问题

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