浏览器Javascript:setTimeout和主程序

时间:2013-08-22 19:07:16

标签: javascript

在浏览器中运行时,setTimeout是否会在主程序执行之前触发其代码?主要的浏览器供应商是否同意这种行为,还是实施的副作用? (或者他们同意将这种副作用保持为标准行为)

考虑一个非常简单(无用)的程序。

setTimeout(function(){
    console.log("Timeout Called")
},1);
for(var i=0;i<10000000;i++){};
console.log("done");

首先,我们设置一个微秒setTimeout回调函数,将Timeout Called输出到控制台。

然后我们旋转一圈超过一秒钟。

然后我们将done输出到控制台。

当我运行此程序时,它总是输出

done
Timeout Called

也就是说,在主程序运行之前不会考虑setTimeout回调函数。

这是可靠的,定义的行为吗?或者是否有时间停止主程序执行,回调运行,然后继续执行主程序。

3 个答案:

答案 0 :(得分:3)

是的,它是定义的行为。一种常见的误解是,Ajax回调在某个时间不确定地执行,可能在当前执行路径完成之前执行,而实际上它们总是会在之后执行一段时间。

Javascript是单线程的,在当前线程完成执行之前永远不会返回事件循环。

异步函数(例如事件处理程序(包括Ajax)或使用setInterval / setTimeout调度的函数在当前执行路径完成之前永远不会执行。

答案 1 :(得分:2)

这是非常明确的行为。

浏览器异步,仍然必须等待上一个操作完成才能执行下一个操作

答案 2 :(得分:1)

使用timeOut时,它将首先等待您传递的毫秒数,然后它将继续等待,直到代码中有一个空缺。通常,这意味着它将等待代码完成。唯一的例外(种类)是使用其他timeOutsetInterval时。例如,如果你的循环是

for(var i=0;i<10000000;i++){
    setTimeout(function () {
        console.log('One iteration');
    }, 15);

};

您的输出将是

done
Timeout Called
One iteration
One iteration

等等。