setTimeout(function () { /*logic*/ }, 0);
真的让函数异步吗?
答案 0 :(得分:4)
不,不使函数异步 - 如果函数需要一些时间,它仍会阻塞该线程。
但是,setTimeout
会将此功能置于浏览器的事件队列中。因此它将在已经在该队列上并等待执行的所有其他事件之后执行(并且如果您没有使用超时,将在脚本块完成后执行)。
准确地说,setTimeout(xxx,0)
没有任何意义,最小延迟为4毫秒,如in the spec所述。
总的来说,时间比我在这里解释的要复杂一点,但这可能足以解释说明;)有关详情,请查看John Resig's Article。
答案 1 :(得分:1)
不,不。
它只是将函数放在具有给定延迟的事件队列中(这里的延迟为零)。如果当前有任何其他函数排队等待执行,它将被置于它们后面并且必须等到那些(包括当前活动的)函数被执行。
为了测试这个,你可以做类似ethis
的事情console.log( 'start' );
setTimeout(function () {
console.log("timeout");
}, 0);
// some very long running code
console.log( 'end' );
您仍然可以获得输出:
启动
端
超时
答案 2 :(得分:0)
不完全
console.log("1");
setTimeout(function () {
console.log("2");
}, 0);
console.log("3");
你可能会看到输出......
1
3
2
超时不会阻止代码的执行,但所有浏览器都会强制执行最小超时延迟。
答案 3 :(得分:0)
有点难以解释整个javascript计时器的事情。可能这会对你有帮助。