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的第一个参数。你能用更多的数据来解释它吗?谢谢,
答案 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,然后重复执行:
再过几秒后,再次调用该函数,但您应该已经知道它是如何工作的。
您可以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时才会执行。