Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
父函数JavaScript中的While循环_Javascript - Fatal编程技术网

父函数JavaScript中的While循环

父函数JavaScript中的While循环,javascript,Javascript,我在解释此代码的作用时遇到问题。这是: function parent(e, n) { if (n === undefined) n = 1; //if n is not defined, use 1 by default while(n-- && e) e = e.parentNode; if (!e || e.nodeType !== 1) return null; return e; } 此函数接受两个参数。一个用于元

我在解释此代码的作用时遇到问题。这是:

function parent(e, n) { 

    if (n === undefined) n = 1; //if n is not defined, use 1 by default

    while(n-- && e) e = e.parentNode; 

    if (!e || e.nodeType !== 1) return null; 

    return e;   

}
此函数接受两个参数。一个用于元素,第二个用于元素的祖先。因此,在第二个参数中传递2将检索元素的祖辈(DOM树上的2个元素)


除了
while
循环之外,我完全理解它。我不知道倒计时是如何选择那个特定的祖先的。while循环如何使这个函数选择一个祖先呢?

这里重要的一点是数字是“真实的”(或虚假的)
0
的作用与
false
相同。因此,当
n
达到零时,循环结束

因此,如果
n
从2开始,循环最多运行2次

另一种情况更容易理解。如果节点没有父节点,则循环也将终止


循环的每次迭代都会执行
e=e.parentNode
,这将获取“当前”节点的父节点。如果循环执行2次迭代,将在dom上向上移动2层(“祖父母”)。

看起来它获得了第n个父元素…

循环的每次迭代都会查看传入元素的父节点。因此,如果传入一个以1作为迭代因子的特定div,它将查找div的直接父级。如果传入2,它将查找2个父级(div父级的父级)。它通过使用e.parentNode并在循环的每次迭代中将e重置为其父节点来实现此目的。

尝试以下方法:

var n = 2;
while(n--) console.log("do this " + n + " more times.");

if(0){
  console.log("never executed because zero is evaluated as false");
}
在支持console.log的浏览器中

在说明数字0的计算结果为假之前,已给出答案

n——表示返回n的值,然后减去1。如果在上面的代码中有--n,那么它只会执行一次(先减去)


在代码中,如果n为2,则循环将执行2次,在循环中,变量e(元素)设置为元素的父节点。如果没有父节点,那么e将是未定义的,在这种情况下,If(e){…}语句不会做任何事情,因为计算未定义的值会导致false。因此,当e未定义时(例如没有父节点),即使n不是0,n&&e也会返回false。

我知道while循环将在它达到0时终止。。但是函数如何确切地知道向上提升两个DOM元素??我在任何地方都看不到这种逻辑。
e=e.parentNode
“上升”一级。这是一个执行
n次的循环。啊!这让我很高兴。把这个加在答案上,我给你打勾。这是有道理的。太真实了,我肯定应该读得更仔细些,对不起!我应该删除我的回复吗?什么是正确的礼仪?我看你会学得很快:)无论如何,任何时候你可以扩展或改进你的答案,就去做吧。在这种情况下,由于问题已被标记为已由其他人回答,可能不会有太大影响(除非您的答案最终更好)。很高兴知道,非常感谢ewall让我成为一名更好的堆垛工!:)