假设我这样做
setTimeout(foo, 0);
...
setTimeout(bar, 0);
我可以确定 foo 会在 bar 之前开始执行吗?如果我使用 1、10 或 100 的超时值代替 0,会怎么样?
简单的实验表明,在超时值相等的情况下,超时目标的执行顺序与 setTimeouts 本身的顺序相同,但是依赖这种行为安全吗?
依赖这种行为是不安全的。我编写了一个测试脚本,它使用 setTimeout(..., 0) 调度许多函数(它们反过来也调度许多函数),并且调用函数的顺序并不总是与调用 setTimeout 的顺序相同(至少在 Chrome 11 中,我用它来运行脚本)。
您可以在此处查看/运行脚本:http://jsfiddle.net/se9Jn/ http://jsfiddle.net/se9Jn/(该脚本使用 YUI 来实现跨浏览器兼容性,但 Y.later 在内部使用 setTimeout)。
请注意,如果您只是运行脚本并盯着控制台,您可能不会看到有问题的顺序。但是,如果启动脚本,切换到另一个选项卡,加载一些页面,然后返回测试页面,您应该在控制台中看到有关回调乱序的错误。
如果您需要保证顺序,我建议在上一个函数的末尾安排下一个函数:
setTimeout(foo, 0);
...
function foo() {
...
setTimeout(bar, 0);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)