Noob警报! 我似乎无法理解这个while循环中的逻辑。它取自O'Reilly的“JavaScript:The Definitive Guide”第15.3章,例15-2。我明白它用n--递减n。但我无法理解布尔AND运算符背后的推理或理论。这循环是什么意思?当n递减并且var存在?对我来说,它似乎应该递增,但当我改变 - 到++时,函数总是返回null。帮助我更深入地了解。
var firstpara = document.getElementsByTagName("p")[0];
/**
* Return the nth ancestor of e, or null if there is no such ancestor
* or if that ancestor is not an Element (a Document or DocumentFragment e.g.).
* If n is 0 return e itself. If n is 1 (or
* omitted) return the parent. If n is 2, return the grandparent, etc.
*/
function parent(e, n) {
if (n === undefined) n = 1;
while (n-- && e) e = e.parentNode;
if (!e || e.nodeType !== 1) return null;
return e;
}
parent(firstpara, 1); //returns <body>...</body> which is the parent node in my testpage
答案 0 :(得分:1)
它返回n
标记的<p>
父项。
假设这是示例代码。
<div class="outer">
<div class="inner">
<p>Sample Code</p>
</div>
</div>
parent(firstpara,1)
会为您提供第一个祖先,在此示例中为<div class="inner">...</div>
。
parent(firstpara,2)
会为您提供第二个祖先,在此示例中为<div class="outer">...</div>
。
parent(firstpara,0)
会为您提供相同的标记,即<p>...</p>
最后,parent(firstpara,10000)
会给你null,因为这样的祖先不存在(可能)。
我希望我说清楚。
答案 1 :(得分:1)
while条件语句由两部分组成,n--
和e
。只要两者都是真的,循环就会继续。对于第一部分,如果(n--)== 0则为假。否则它是真的。如果定义了e,则第二部分为真。第一部分可能就是你被挂掉的东西。它基本上是做两个语句的简便方法:n = n - 1;
后跟if (n != 0 AND e exists) then continue looping
(伪代码)。
答案 2 :(得分:0)
假设双星号试图在示例中生成粗体文本,我们留下:
while (n-- && e) e = e.parentNode;
n--对生成进行倒计时......一旦它达到零,它就会变为假,因此会停止循环。 - 将递减零,留下-1,但这没关系,因为它是在测试的减量之前的n的值。
如果节点提前用完,“e”也会停止循环,因为没有值为false。
&amp;&amp;确保n必须仍然是正的并且存在以继续。 bing false将结束循环。
Paranoid me会将循环编码为:
while (n-- > 0 && e) e = e.parentNode;
这确保了无论如何,代码都不会以奇怪的方式失败。这是我很久以前学到的循环的一般规则,适用于所有循环。