请教:JavaScript无初始表达式的for循环语法解析
这其实是JavaScript中for循环的一个常用技巧——利用了for循环三个表达式全部可选的特性,我来给你拆解开讲清楚:
首先先回忆下for循环的标准语法:
for( [初始化表达式]; [条件表达式]; [更新表达式] ) { // 循环体 }
你可能习惯了三个表达式都填的常规写法,但其实这三个部分每一个都可以省略,甚至可以写成for(;;)来做无限循环(只要循环体内有终止逻辑就行)。
回到你的代码:
for ( ; elem && elem !== document; elem = elem.parentNode ) { if ( elem.matches( selector ) ) return elem; }
我们逐个解析三个部分:
空的初始化表达式:
这里之所以留空,是因为循环要用到的elem已经通过函数参数传入了——调用这个函数时,elem已经是一个确定的DOM元素,不需要在循环里额外声明或初始化变量,所以这部分直接空着就行。条件表达式
elem && elem !== document:
这是循环的“准入规则”:每次循环开始前都会判断这个条件。只要elem存在(不是null/undefined),并且还没遍历到最顶层的document,就继续执行循环体;一旦条件不满足,循环会直接终止。更新表达式
elem = elem.parentNode:
每次循环体执行完毕后,都会执行这个表达式——把当前的elem替换成它的父节点,这样下一次循环就能继续向上遍历DOM树了。
换个写法更直观
这个for循环完全等价于你更熟悉的while循环:
function parent(elem, selector) { while (elem && elem !== document) { if (elem.matches(selector)) return elem; elem = elem.parentNode; } }
只不过用for循环把“循环条件”和“变量更新”整合到了一行里,写法更紧凑,是前端开发者处理DOM向上遍历的常用简洁写法。
总结一下:这种空初始化的for循环,本质就是复用已经存在的变量,省去多余的初始化步骤,完全符合JavaScript语法规范,在这类“从已有变量开始迭代”的场景下非常实用。
内容的提问来源于stack exchange,提问作者user6275251

