2

setTimeout(function () { /*logic*/ }, 0);

真的使函数异步吗?

4

4 回答 4

4

不,它不会使函数异步 - 如果函数需要一些时间,它仍然会阻塞线程。

但是,setTimeout将此函数放入浏览器的事件队列中。因此,它将在该队列中已经存在并等待执行的所有其他事件之后执行(如果您没有使用超时,它将在您的脚本块完成后执行)。

准确地说,setTimeout(xxx,0)没有任何意义,最小延迟为 4ms,如规范中所述

总而言之,时间比我在这里解释的要复杂一些,但这可能足以作为顶级解释;)有关更多信息,请查看John Resig 的文章

于 2013-05-15T10:53:11.830 回答
1

不,不是的。

它只是将函数放在具有给定延迟的事件队列上(这里延迟为零)。如果当前有任何其他函数在排队等待执行,它将被放置在它们后面并且必须等到那些(包括当前活动的)函数被执行。

要对此进行测试,您可以执行类似的操作

console.log( 'start' );
setTimeout(function () {
    console.log("timeout");
}, 0);

// some very long running code 
console.log( 'end' );

你仍然会得到输出:

开始

结尾

暂停

于 2013-05-15T10:53:53.570 回答
0

解释整个 javascript 计时器的事情有点困难。可能这会对你有所帮助。

John Resig 博客:Javascript 计时器如何工作

于 2013-05-15T10:53:56.990 回答
0

不完全是

console.log("1");
setTimeout(function () {
    console.log("2");
}, 0);
console.log("3");

您可能会看到输出...

1
3
2

超时不会阻止代码的执行,但所有浏览器都会强制执行最小超时延迟。

于 2013-05-15T10:48:08.483 回答