javascript - setZeroTimeout
原文 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; })();