代码的执行方式

how the code is executed?

本文关键字:方式 执行 代码      更新时间:2023-09-26
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 的第一个参数。 你能用更多的数据来解释它吗? 谢谢,

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 是一个闭包,然后索引变量值在不同的调用之间保留。

在第一次调用时,索引为 -1,然后执行跳过第一个 if 并且控件转到 index++ 指令(可能"#latest a"链接在第一次运行时全部隐藏,因此您不必隐藏任何内容(

现在,在我们继续之前,先说个题外话: 你应该知道 eq 方法应用于集合 元素,并检索它应用到的集合的第 n 个从零开始的元素。 如果你有一个包含三个元素的集合,你可以用 eq(0( 来称呼它们。等式(2( 和 这就是为什么你进入这个>奇怪的如果。这是一个守卫,这意味着如果你越过 我集合的最后一个元素>从第一个元素重新启动。

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

在最后一条指令中,将显示第一个链接并停止执行。

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

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

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

你可以谷歌一下闭包,深入了解它们的内部工作原理,或者只是参考,作为一个起点,JavaScript闭包是如何工作的?在Stackoverflow本身。

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

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

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

setInterval期望函数表达式/引用作为其第一个参数,这意味着如果将上述结构作为第一个参数传入,则它很高兴,因为上面返回了一个函数。

所有这一切的要点本质上是保持功能的独立性,而不是声明使用称为"index"的全局变量的"普通"函数。

至于函数中的代码实际做了什么,嗯,它将每 1000 毫秒执行一次。如果index >= 0,除了第一次之外,每次都是这样,那么all.eq(index).hide();将被执行 - 我假设这会隐藏与当前索引匹配的元素。 然后index递增,如果达到all中的最大元素数,则第二个 if 将其设置回 0,基本上确保代码将继续循环通过元素。最后显示(新递增的(索引处的元素。

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

如果 index=0,则将执行 all.eq(index(.hide((。第二个 if 也可以执行,但前提是 all.length = 0。