祝贺《JavaScript 秘密花园》中文翻译被官方正式采纳,大家以后可以随时通过官方网站浏览:http://bonsaiden.github.com/JavaScript-Garden/zh/
由于这是一个不断更新的文档,如果有新的更新或者纠错我会及时更新中文翻译。
这篇文章的起因是有网友提的 Issue: https://github.com/BonsaiDen/JavaScript-Garden/issues/#issue/68
大致意思说是原文对 setInterval 的描述不大准确,而 Stackoverflow.com 上的描述才算正确。本着学习的态度,我又仔细看了两个描述:
JavaScript 秘密花园:
当回调函数的执行被阻塞时,setInterval
仍然会发布更多的毁掉指令。在很小的定时间隔情况下,这会导致回调函数被堆积起来。
Stackoverflow.com:
intervals try to ‘catch up’ to get back on schedule. But, they don't queue one on top of each other: there can only ever be one execution pending per interval.
x represents an interval firing that couldn't execute or be made pending, so instead was discarded.
争论的焦点是:如果回调函数需要花很长的时间执行(比定时时间长的多),那些这些回调函数会不会被堆积起来?
目前 《JavaScript 秘密花园》的意思是会堆积起来,而 Stackoverflow 的那篇文章的意思是一些来不及执行的回调会被丢弃,特别的那个图形描述很生动:
. * • • x • • x
[------][------][------][------]
为了验证谁对谁错,我写了一段 JavaScript 代码: http://jsfiddle.net/sanshi/3XLHc/
var count = 0,
start = new Date(),
interval;
function loop() {
var i, time;
if (count <= 5) {
for (i = 0; i < 1000000000; i++) {}
}
time = new Date() - start;
$('#result').append("<li>time:" + time + " - count:" + count + '</li>');
count++;
if (count >= 15) {
clearInterval(interval);
}
}
interval = setInterval(loop, 1000);
执行结果:
- time:2840 - count:0
- time:4668 - count:1
- time:6489 - count:2
- time:8358 - count:3
- time:10180 - count:4
- time:12002 - count:5
- time:12004 - count:6
- time:13004 - count:7
- time:14001 - count:8
- time:15001 - count:9
- time:16002 - count:10
- time:17003 - count:11
- time:18017 - count:12
- time:19017 - count:13
- time:20018 - count:14
可见,count 等于 5 时,时间已经过去了12 秒钟,如果按照 JavaScript 秘密花园 中的说法,此时累计的回调函数已经有 12 - 5 = 7 个了,那么在下面如果回调函数执行时间很短的情况下会连续执行,但是实际情况并非如此,以后的回调都是 1 秒为间隔的。
也就是说一些 setInterval 的回调被丢弃了。所以 Stackoverflow 的那篇文章的描述是正确的。
我会随后更新这个改动到中文翻译中(可能要一周后,最近在老家没网络了。。。)。