请参见下面的代码。
SetTimeout应该在100ms时间后执行seconf函数。但是第一个阻止了第二个,这是意外的。 Settimeout以异步方式工作。
function funcOne(){
console.log("FuncOne invoked")
let i=0;
while(i<10000000000){i++}
console.log("Hello world")
}
function funcTwo(){
console.log("FuncTwo invoked");
}
setTimeout(funcOne,0)
setTimeout(funcTwo,100)
输出应为
调用FuncOne
调用了FuncTwo
Hello World
但是实际输出是
调用FuncOne
HelloWorld
调用了FuncTwo。
答案 0 :(得分:3)
JavaScript不能在单独的线程中运行*,因此所有代码都在一个线程中运行。任何“异步”就是轮流运行的各种代码。 Javascript引擎永远不会中断一个功能,因为另一个功能计划在给定的时间运行,这是您需要照顾好自己的事情。
因此,在您的情况下,funcOne
被执行(完全),即使花费了100毫秒以上的时间,也会检查超时,并且由于funcTwo
将要运行,因此它会被执行(完全)。
*好吧,也许和工人在一起,但这并不漂亮。
答案 1 :(得分:0)
在您的while循环结束之前,不会调用第二个setTimeout
所以你得到了这个订单
第一次超时 FuncOne被调用 While循环结束 你好世界
在100毫秒funcTwo调用后,调用了第二次超时