代码是如何执行的?

时间:2011-10-27 01:16:52

标签: javascript

setInterval((function() {
        var index = -1;
        return function() {
            var all = $('#latest a');
            if (index >= 0) {
                all.eq(index).hide();
            }

            index++;
            if (index == all.length) {
                index = 0;
            }

            all.eq(index).show();        
        };
    })(), 1000);

代码是如何执行的?当index = -1;不符合第一个if条件时,代码将执行index++;现在index=0,那么代码将执行哪一步? if (index >= 0)if (index == all.length)为什么?

我不能很好地遵循setInterval的第一个参数。你能用更多的数据来解释它吗?谢谢,

3 个答案:

答案 0 :(得分:2)

SetInterval每秒在第一个参数中调用该函数。

我会将您的代码拆分为语义等效的代码,以便更清晰

timedFn = (function() {
    var index = -1;
    return function() {
        var all = $('#latest a');
        if (index >= 0) {
            all.eq(index).hide();
        }

        index++;
        if (index == all.length) {
            index = 0;
        }

        all.eq(index).show();        
    };
})();

setInterval(timedFn, 1000);

timeFn是一个闭包,然后在不同的调用之间保留索引变量值。

在第一次调用时,index为-1,然后执行跳过第一个if并且控件转到index++指令(可能'#latest a`链接都在第一次运行时隐藏了所以你不必隐藏任何东西)

  

现在,我们可以继续前进:   您应该知道eq方法应用于集合   元素并检索应用它的集合的基于零的第n个元素。   如果你有三个元素的集合,你可以通过eq(0)... eq(2)和   这就是你进入这个> 奇怪的的原因。这是一个守卫,意味着你过去了   我收集的最后一个元素>从第一个元素重启。

更新的索引现在包含0,如果集合为空,您将有一个错误,因为索引保持不变(索引= 0但索引已经为零),show将尝试显示不存在元件。

通过最后一条指令显示第一个链接并停止执行。

一秒钟后,第二次调用该函数,但这次索引星号为0,而不是-1,然后重复执行:

  • 隐藏第一个元素
  • 将1添加到索引
  • 如果您的集合中只有一个锚点,则将索引重置为零
  • 显示第二个元素
  • 功能结束

再过几秒后,再次调用该函数,但您应该已经知道它是如何工作的。

您可以google在闭包上查看其内部工作的不正确的视图,或者仅作为起点,在Stackoverflow本身上引用How do JavaScript closures work?

答案 1 :(得分:1)

setInterval的第一个参数,简化后如下所示:

(function() {
   var index = -1;
   return function() {
      // some code that can access index
   };
})()

定义了一个立即执行的匿名函数表达式(请注意,在函数定义的末尾它有()导致执行)。当执行这个外部函数时,它返回内部匿名函数,由于闭包的魔力,内部(嵌套)函数可以访问外部函数中定义的index变量。

setInterval期望函数expresssion / reference作为它的第一个参数,这意味着如果将上述结构作为第一个参数传入,则会很高兴,因为上面的函数会返回一个函数。

所有这一切主要是为了保持功能自包含,而不是声明一个使用名为“index”的全局变量的“普通”函数。

关于函数中的代码实际执行的内容,它将每1000ms执行一次。如果index >= 0,除了第一次之外每次都是all.eq(index).hide();,那么index将被执行 - 我假设它隐藏了与当前索引匹配的元素。然后all递增,如果它达到{{1}}中的最大元素数,则将其设置为0,从而确保代码将循环通过元素。最后显示(新增加的)索引处的元素。

据推测,所有这些元素都是隐藏的,因此整体效果是显示然后一次隐藏一个元素,每秒更改一次。

答案 2 :(得分:0)

如果index = 0,则执行all.eq(index).hide()。第二个if也可以执行,但仅当all.length = 0时才会执行。