MyFunction()vs window.setTimeout('MyFunction()',0)?

BeC*_*ool 13 javascript

在javascript中,这两者之间有什么不同:

// call MyFunction normal way 

MyFunction();

// call MyFunction with setTimeout to 0 //

window.setTimeout('MyFunction()', 0);
Run Code Online (Sandbox Code Playgroud)

我问的原因是因为最近遇到的情况是代码只有在我setTimeout(0)用来调用函数时才有效.据我所知,setTimeout(0)与直接调用函数完全相同,因为你没有设置任何延迟.但是从我看到它在代码中如何工作,setTimeout(0)似乎最后执行.

有人能够确切地说明setTimeout(0)按照其他函数调用的顺序调用它的确切方式吗?

Vin*_*lds 17

setTimeout()总是导致JavaScript块排队等待执行.这是一个何时执行的问题,由延迟决定.以延迟0调用setTimeout()将导致JavaScript解释器意识到它当前正忙(执行当前函数),并且解释器将调度脚本块在当前调用堆栈为空时执行(除非那里)是排队的其他脚本块).

调用堆栈可能需要很长时间才能变空,这就是您看到执行延迟的原因.这主要是由于单个窗口上下文中JavaScript的单线程特性.

为了完整起见,MyFunction()将立即执行该函数.不会有排队.

PS:John Resig有一些关于JavaScript计时机制如何工作的有用说明.

PPS:只有当你使用setTimeout(fn(),0)时你的代码"似乎工作"的原因是浏览器只有在当前调用堆栈完成时才能更新DOM.因此,下一个JavaScript块将识别DOM更改,这在您的情况下是非常可能的.setTimeout()回调总是会创建一个新的调用堆栈.