浏览器Javascript:setTimeout和主程序

浏览器Javascript:setTimeout和主程序,javascript,Javascript,在浏览器中运行时,setTimeout是否会在主程序执行完毕之前触发其代码?主要浏览器供应商是否同意这种行为,或者这是实施的副作用?(或者他们是否同意将这种副作用作为标准行为加以控制) 考虑一个非常简单(而且无用)的程序 也就是说,在主程序运行之前,不会考虑setTimeout回调函数 这种行为可靠吗?或者主程序执行会暂停,回调运行,然后主程序继续执行 是的,这是一种被定义的行为。一个常见的误解是Ajax回调在某个时间执行,可能在当前执行路径完成之前,而实际上它们总是在某个时间之后执行 Java

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

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

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


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

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

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


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

这是定义非常明确的行为


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

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

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

};

等等。

。。。阻止浏览器错误。Safari 5有一段时间有一个bug,它会从嵌套的iFrame中触发“加载”事件,这些事件会抢占正在运行的事件处理程序。@Pointy我不知道这个bug。谢谢你指出这一点。你有一个参考链接可以添加到我的答案中吗?我只知道,因为它导致jQuery出现了一些非常奇怪的行为。我看看能不能找到我记录的旧bug。我认为这真的不值得担心;毕竟,随着Chrome大约每3小时更新一次,任何事情都可能随时发生:)
done
Timeout Called
for(var i=0;i<10000000;i++){
    setTimeout(function () {
        console.log('One iteration');
    }, 15);

};
done
Timeout Called
One iteration
One iteration