2016-04-10 7 views
0

Noob警告! このwhileループ内のロジックを理解できないようです。これは、O'Reillyの「JavaScript:The Definitive Guide」15.3章の例15-2から取ったものです。私はnとnを減らしていることを理解しています。しかし、論理AND演算子を使ってその背後にある推論や理論を理解することはできません。このループは何を言っているのですか? nは減分され、var eは存在しますか?私にとっては、インクリメントする必要があるようですが、 - を++に変更すると、関数は常にnullを返します。もっと深く理解できるように助けてください。JavaScript:このwhileループのロジックを理解するのに問題があります

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

nがゼロでない限り 'n - 'は 'true'になるので、いくつかの反復回数の後に親が存在しないとき* * * nがデクリメントされて*になります。 – Pointy

答えて

0

は、我々が残っている例では、太字のテキストを生成する試みです:それはゼロに当たる一度世代ダウン

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

N--カウント...それゆえ偽となり、ループを停止します。 - は-1を残してゼロをデクリメントしますが、それはテストされたデクリメントの前にnの値だったので問題ありません。

"e"は、値がfalseでないためノードが早期になくなった場合にもループを停止します。

& &は、nがまだ正でなければならず、whileを続けるためにはeが存在することを保証します。 bing falseの場合、ループは終了します。これは、どんなコードは奇妙な形で失敗しないだろう、ということを保証

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

パラノイド私はより多くのようなループをコーディングします。これは私がずっと前に学んだループの一般的なルールであり、すべてのループに適用されます。

+0

私の脳の霧が解除されました。今、私は分かる。ありがとう。 –

1

それは<p>タグのn番目の親を返します。

これがサンプルコードであるとします。

<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>という2番目の祖先となります。

parent(firstpara,0)はあなたに同じタグを与えるだろう、そのような祖先は、(おそらく)が存在しないため、すなわち、<p>...</p>

は最終的に、parent(firstpara,10000)はあなたにヌルを与えるだろう。

私はそれを明確にしたいと思います。二重アスタリスクを想定し

+0

はい、私は理解できませんが、なぜループ内で減分nです。私は(n-- && e)、なぜそれがそのように行われたのか分かりません。私はコード内で++演算子を見慣れていると思います。 :) –

+0

ジョナサンを理解しています。だからこそ私はnoobアラートで始まった: –

1

while条件文は、n--eの2つの部分で構成されています。両方が真である限り、ループは継続します。最初の部分では、(n--)== 0ならfalseです。それ以外の場合は真です。 eが定義されている場合、2番目の部分は真です。最初の部分はたぶんあなたがぶち壊しているものです。これは、基本的には、n = n - 1;とそれに続くif (n != 0 AND e exists) then continue looping(擬似コード)という2つのステートメントを実行する短い手続きです。

関連する問題