for循环中嵌套setTimeout,执行顺序和结果的理解

2019-01-11  本文已影响0人  AMONTOP
for(var i=0;i<10;i++){
    setTimeout(function () {
        console.log(i);
    },0)
}

同步优先、异步靠边、回调垫底!
公式表达:同步 => 异步 => 回调

JS是单线程环境,也就是说代码的执行是

同步执行:从上到下,依次执行。

for循环是同步代码,setTimeout中的是异步代码。

那么JS碰到这个有同步和异步的情况下:

比如上面这段代码中,第二个参数延时时间是0,也就是说执行到它的时候会在0ms之后将它插入到任务队列当中。
同步代码都执行完成之后,那么JS引擎就空闲了,这个时候就轮到任务队列中的异步代码依次加载了。

这是上面这段代码的答案的一半。


另一半就来自于作用域,作用域是变量等资源的作用范围。
在这段代码中准确的说是作用域链的问题,当同步代码执行完毕开始执行异步的setTimeout代码时,

解决方法:

1、立即执行函数
它逼迫js每次循环进来的时候都会立即去执行代码,从而保证了每一次得到了i的副本都是不一样的。

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

2、let

for (let i = 0; i < 10; ++i) {  
    setTimeout(function() {  
        console.log(i);  
    }, 1000);  
} 
上一篇 下一篇

猜你喜欢

热点阅读