原文 http://ajaxian.com/archives/settimeout-delay
(可能已被墙)
js中的setTimeout(fn, delay)
该函数通常用于2种情况:
1. 为了创建延时
2. 为了新开"线程"来避免堆栈溢出
第2种情况下延时不是我们的目的,所以通常希望delay值越小越好,但即使把delay值设置成0,也不能真正做到零延时,各浏览器对于setTimeout都有一个最小延时,大部分浏览器是10ms。就是说即使setTimeout(fn, 0) 也会有10ms延时,下面介绍一种真正零延时的做法:setZeroTimeout
(function() {
var timeouts = [];
var messageName = "zero-timeout-message";
function setZeroTimeout(fn) {
timeouts.push(fn);
window.postMessage(messageName, "*");
}
function handleMessage(event) {
if (event.source == window && event.data == messageName) {
event.stopPropagation();
if (timeouts.length > 0) {
var fn = timeouts.shift();
fn();
}
}
}
window.addEventListener("message", handleMessage, true);
window.setZeroTimeout = setZeroTimeout;
})();