浏览器Javascript:setTimeout和主程序



在浏览器中运行时,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回调函数。

这种行为可靠吗?或者有时主程序执行将暂停,运行回调,然后继续执行主程序。

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

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

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

这是定义非常好的行为。

浏览器是异步的,在执行下一个操作之前,仍必须等待上一个操作完成。

使用timeOut时,它将首先等待您通过的毫秒数,然后继续等待,直到代码中有空位为止。一般来说,这意味着它将等待代码完成。唯一的例外是使用其他timeOutsetInterval。例如,如果您的循环是

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

你的输出将是

done
Timeout Called
One iteration
One iteration

等等。

最新更新