浏览器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