代码的执行方式
how the code is executed?
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。
- 我想以异步方式执行常规函数
- 当以编程方式更改输入值时,不会执行更改时事件
- Javascript - 以编程方式执行所有函数输入的方法
- 如何使用cURL或其他方式在点击时执行事件
- Turbolinks:body标记中的javascript代码没有按应有的方式执行
- 如何在CKEDITOR中以编程方式执行undo和redo,并重置它们的堆栈
- Javascript数学不起作用,更好的方式来执行操作
- 如何在Ember中以编程方式执行ArrayController[index]
- 以编程方式打开火狐浏览器并执行 POST 请求?[想法:MozRepl,建议?
- 承诺在以不同方式执行时显示不同的结果
- 为什么用户选中一个框与以编程方式执行不同
- D3.js以不同的方式执行
- 以连续的方式执行循环中的所有元素
- React Native使用什么来允许JavaScript在iOS和Android上以本机方式执行
- 根据函数首次运行的时间,以不同的方式执行函数
- 在一个库被添加/下载并以承诺的方式执行后,是DOM中的元素
- 如何以编程方式执行javascript,就像从浏览器栏
- Node js中的回调函数是否以同步方式执行
- Javascript条件正在以任意方式执行
- 以同步方式执行异步调用