4

在浏览器中运行时,会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主程序运行之前不会考虑回调函数。

这是可靠的、明确的行为吗?或者是否存在主程序执行将停止,回调运行,然后主程序执行继续的时候。

4

3 回答 3

3

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

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

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

于 2013-08-22T19:08:53.413 回答
2

这是非常明确的行为。

浏览器不是异步的,仍然需要等待上一个操作完成才能执行下一个操作

于 2013-08-22T19:09:01.513 回答
1

使用时timeOut,它会先等待你经过的毫秒数,然后它会继续等待,直到代码中有一个开口。通常,这意味着它将等到代码完成。唯一的例外(有点)是在使用其他timeOuts 或setIntervals 时。例如,如果您的循环是

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

};

你的输出将是

done
Timeout Called
One iteration
One iteration

等等。

于 2013-08-22T19:16:33.857 回答