for循环语法

时间:2018-01-07 00:54:52

标签: javascript html css

有人可以解释这部分代码。

function parent (elem, selector ) {
		 for ( ; elem && elem !== document; elem = elem.parentNode ) {
        if ( elem.matches( selector ) ) return elem;
    }
}

我理解他的所作所为,但我不明白这一部分的循环开始:for ( ; elem && elem !== document; ...

通常我们必须指定迭代的起始编号,这对我来说非常奇怪。

感谢您的帮助。

3 个答案:

答案 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;
    }
}