有人可以解释这部分代码。
function parent (elem, selector ) {
for ( ; elem && elem !== document; elem = elem.parentNode ) {
if ( elem.matches( selector ) ) return elem;
}
}
我理解他的所作所为,但我不明白这一部分的循环开始:for ( ; elem && elem !== document; ...
通常我们必须指定迭代的起始编号,这对我来说非常奇怪。
感谢您的帮助。
答案 0 :(得分:2)
虽然循环配置的第一部分用于设置索引,但第二部分是循环条件的位置。如果条件不是基于索引,则可以省略索引。在这种情况下,循环关心传递的参数elem
,而不是索引。
事实上,for
的所有3个配置部分都是可选的(使for
更像while
)。来自 MDN :
语法
for ([initialization]; [condition]; [final-expression])
statement
(您可能知道,出于语法目的而在参数列表中使用[]
意味着可选。)
以下是一个例子:
var obj = {}; // Not null
// Keep looping as long as obj is not null (which it isn't to start)
for ( ; obj != null; obj=null) {
console.log("Loop!"); // First time through the loop, obj != null so loop will go
} // After first iteration, obj will become null (because of 3rd part of loop config)
// so loop will terminate
话虽如此,这肯定不是使用JS for
语法的优雅方式。可以使用while
循环以更易读的方式处理逻辑:
function parent (elem, selector ) {
while (elem && elem !== document){
if (elem.matches( selector )) {
return elem;
}
elem = elem.parentNode;
}
}
答案 1 :(得分:1)
您可以参考this。 for循环的结构由三个语句组成,所有语句都是可选的。第一个语句在循环开始之前执行,因此通常用于变量声明。第二个语句用于定义条件。第三个语句在每个循环上调用,因此它通常用于递增或递减值,或分配新值。 如果所有这些陈述都不存在,则表示它是一个无限循环。
for (;;)
当第一个语句不存在时(例子中就是这种情况),则需要声明变量或在for循环开始之前执行代码块。但是,仍然必须满足条件以保持循环(语句2)和每个循环调用的块(语句3)。
声明1:无//如果有,则会在开头调用
声明2: elem&& elem!== document //决定是否继续循环
声明3: elem = elem.parentNode //调用每个循环
答案 2 :(得分:1)
没有任何内容指明for
循环必须使用迭代器。发现for
循环语法是因为迭代一系列数字是很常见的,而使用while
循环执行此操作总是看起来像这样:
var counter = 0;
while (counter < 10) {
// do something...
counter++;
}
因为看到变量用作迭代器是如此常见,所以要在while
循环中检查表达式,并在while
循环体的末尾进行增量操作,聪明的程序员创建了for
循环语法,以便可以以简洁的方式预先声明这些部分:for ([initialization]; [condition]; [final-expression])
。请注意,实际上可以省略这些部分中的任何部分 - 在括号内实际只需要半冒号。
此代码的作者并不需要迭代器,但是,也许他或她只是喜欢所有必要的部分都在一行上。您可以使用while
循环轻松编写此函数,如下所示:
function parent(elem, selector) {
while (elem && elem !== document) {
if (elem.matches(selector)) {
return elem;
}
elem = elem.parentNode;
}
}