我正在使用setTimeout函数: -
function myFunction() {
alert("1"); // Called 1st
setTimeout(function(){
alert("2"); // Called Third
}, 0000);
/*Same as setTimeout window.setTimeout(slowAlert, 0000);function slowAlert() { alert("That was Same as setTimeout!");}*/
alert("39"); // Called Second
}
即使我使用零秒,我也无法理解为什么警报(' 2')第三次来电
答案 0 :(得分:1)
setTimeout()
异步调用回调函数。因此,即使设置为零超时,也无法保证订单。
要使其同步,请移除setTimeout()
,然后直接致电alert('2');
。
function myFunction() {
alert("1"); // Called 1st
alert("2"); // Called second
alert("39"); // Called third
}
<强>更新强>
如果您想确保订单保持不变,请在alert("39")
内移动setTimeout()
。
function myFunction() {
alert("1"); // Called 1st
setTimeout(function() {
alert("2"); // Called second
alert("39"); // Called third
}, 0);
}
答案 1 :(得分:1)
setTimeout
会将您的回调添加到event loop,稍后当浏览器不忙时会调用该回调。第二个参数只是告诉浏览器何时您的回调添加到事件循环,而不是执行时。在你的情况下,它是零,所以回调几乎立即被添加(它实际上在大约4毫秒内)到循环,但它将在浏览器有时间后执行。代码中的其他警报不会使用setTimeout
,因此会立即执行当前勾号,这就是回调前执行的原因。
答案 2 :(得分:0)
因为浏览器中的JS是单线程的,所以setTimeout会创建一个新的“堆栈”,在当前堆栈被清除后,即在当前函数完成之后执行n
毫秒
答案 3 :(得分:0)
因为setTimeout是异步类函数。因为它打破了同步执行流程。但它并不像单独的线程那样同时执行。
setTimeout(function(){
alert("2"); // Called Third
}, 0000);
上述代码在执行完所有其他语句后执行一次。
答案 4 :(得分:0)
好的,所以,让我们一次打勾,看看你的应用正在做什么:
勾选1 - 提醒(“1”);警报,现在更好地显示它!
Tick 2 - setTimeout(function(){},0000);超时为0秒?好的,我会的 等待
勾选3 - 提醒(“39”);另一个警报,显示!!
勾选4 - 警告(“2”);这是0秒,那次超时又是什么?