做
setTimeout(function () { /*logic*/ }, 0);
真的使函数异步吗?
不,它不会使函数异步 - 如果函数需要一些时间,它仍然会阻塞线程。
但是,setTimeout
将此函数放入浏览器的事件队列中。因此,它将在该队列中已经存在并等待执行的所有其他事件之后执行(如果您没有使用超时,它将在您的脚本块完成后执行)。
准确地说,setTimeout(xxx,0)
没有任何意义,最小延迟为 4ms,如规范中所述。
总而言之,时间比我在这里解释的要复杂一些,但这可能足以作为顶级解释;)有关更多信息,请查看John Resig 的文章。
不,不是的。
它只是将函数放在具有给定延迟的事件队列上(这里延迟为零)。如果当前有任何其他函数在排队等待执行,它将被放置在它们后面并且必须等到那些(包括当前活动的)函数被执行。
要对此进行测试,您可以执行类似的操作
console.log( 'start' );
setTimeout(function () {
console.log("timeout");
}, 0);
// some very long running code
console.log( 'end' );
你仍然会得到输出:
开始
结尾
暂停
解释整个 javascript 计时器的事情有点困难。可能这会对你有所帮助。
不完全是
console.log("1");
setTimeout(function () {
console.log("2");
}, 0);
console.log("3");
您可能会看到输出...
1
3
2
超时不会阻止代码的执行,但所有浏览器都会强制执行最小超时延迟。