在浏览器中运行时,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
回调函数。
这是可靠的,定义的行为吗?或者是否有时间停止主程序执行,回调运行,然后继续执行主程序。
答案 0 :(得分:3)
是的,它是定义的行为。一种常见的误解是,Ajax回调在某个时间不确定地执行,可能在当前执行路径完成之前执行,而实际上它们总是会在之后执行一段时间。
Javascript是单线程的,在当前线程完成执行之前永远不会返回事件循环。
异步函数(例如事件处理程序(包括Ajax)或使用setInterval / setTimeout调度的函数在当前执行路径完成之前永远不会执行。
答案 1 :(得分:2)
这是非常明确的行为。
浏览器不异步,仍然必须等待上一个操作完成才能执行下一个操作
答案 2 :(得分:1)
使用timeOut
时,它将首先等待您传递的毫秒数,然后它将继续等待,直到代码中有一个空缺。通常,这意味着它将等待代码完成。唯一的例外(种类)是使用其他timeOut
或setInterval
时。例如,如果你的循环是
for(var i=0;i<10000000;i++){
setTimeout(function () {
console.log('One iteration');
}, 15);
};
您的输出将是
done
Timeout Called
One iteration
One iteration
等等。