zoukankan      html  css  js  c++  java
  • [原创]祝贺《JavaScript 秘密花园》中文翻译被官方正式采纳

    祝贺《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 的那篇文章的描述是正确的。

    我会随后更新这个改动到中文翻译中(可能要一周后,最近在老家没网络了。。。)。

  • 相关阅读:
    左偏树
    论在Windows下远程连接Ubuntu
    ZOJ 3711 Give Me Your Hand
    SGU 495. Kids and Prizes
    POJ 2151 Check the difficulty of problems
    CodeForces 148D. Bag of mice
    HDU 3631 Shortest Path
    HDU 1869 六度分离
    HDU 2544 最短路
    HDU 3584 Cube
  • 原文地址:https://www.cnblogs.com/sanshi/p/1997348.html
Copyright © 2011-2022 走看看