console.log("1");
setTimeout(function () {
    console.log("2")
}, 1000)
console.log("3");

以上代码运行的结果是什么呢?

javascript等待提示 js等待时间_单线程

上述运行结果是1 3  2,由此可见先执行了开始和结尾的两个输出,最后执行的是setTimeout。

这么理解:Js是单线程的,所有的事件运行都需要排队,首先同步的代码先插入对列先执行,异步的代码后插入队列后执行。 

setTimeout可以理解为是异步的。当然特殊的地方是'等待时间'是从一开始就计算的,所以说setTimeout里面的函数执行时间肯定是'等待时间'之后执行,具体之后多长时间,这个不确定;这里注意不是说同步代码都执行完了之后,才开始计算等待时间,而是'等待时间'从一开始就计算了。

 再通过下面一个列子,加深理解:

var start = new Date();
setTimeout(function () {
    var end = new Date();
    console.log("Time elapsed: ", end - start, "ms");
}, 500);

while (new Date - start <= 1000) {

}

这个输出结果是什么呢?

javascript等待提示 js等待时间_等待时间_02

分析一下结果:首先代码会先执行出将建start这个变量;然后执行while循环;最后执行setTimeout。

while循环只有在时间差大于1000ms时才会退出,才会执行完毕。所以1001ms的时候执行了setTimeout里面的函数,而不是1001ms开始,等待500ms,再执行setTimeout中的函数。也就是说setTimeout里面的500ms的等待时间是从一开始执行代码片段就开始计算了。

 当然如果等待时间改为1500ms,while走完,仍需要等待(1500-1000)ms,所以差不多1501ms的时候执行setTimeout里面的函数。

javascript等待提示 js等待时间_javascript等待提示_03

 

简单总结一下:setTimeout是异步的,所有的同步代码执行完再执行异步。

                         等待时间是从一开始就计算的,不是同步代码执行完再开始计算。

 

在具体的实践环境中,当然还有各种复杂的情况,那就具体情况具体分析了。

另外举一个例子(闭包中经常用的一个例子),我觉得通过上面的案例应该可以理解下面这个:

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

这个的运行结果是什么呢?先想想。。。

javascript等待提示 js等待时间_javascript等待提示_04

对于这样的结果能接受吗?自己分析分析哈。。