2

私はこの例を読んでいて、1行を理解するのに行き詰まっています。先に進めないように、すべてを理解する必要があります。

この関数は、オブジェクト内のすべての要素を非表示にすることになっています。それはうまくいくはずです。しかし、私には、その for ループは無限ループのように見えます。なぜそうではないのですか?

getChild: function (i) {
    return this.children[i];
},

hide: function () {
    for (var node, i = 0; node = this.getChild(i); i++) {
        node.hide();
    }

    this.element.hide(0);
},

私が見たところ、この関数はオブジェクトの最初の要素を getChild(0) で取得し、その 0 次元のオブジェクトに対して再度 hide を呼び出します。次に、カウンター (i) をリセットし、0 次元オブジェクト (同じ 0 次元オブジェクト) の最初の要素を取得して、関数を再度呼び出します。

私は間違っていることを知っていますが、それが私が見ているものです。光を見せてください!ありがとう

4

4 に答える 4

7

上記のようなforループでは、最初のビット ( var node, i = 0) はループの開始時に 1 回だけ実行されます。node = this.getChild(i);中央のセクション ( ) が false を返す と、ループの実行が停止します。getChildindex に何もない場合は false を返しますi。(技術的には を返しますundefinedが、この例では に相当しfalseます)。

第二にhide()、 for ループで呼び出されても、iリセットされません。なんで?この再帰呼び出しはhide()、元のインスタンスとは別の新しいインスタンスを作成します。この新しい変数のすべては、元の変数とhide()は別のものです。(など、うさぎの穴を下ります)。

for ループの詳細については、 http://www.tizag.com/javascriptT/javascriptfor.phpを参照してください。

于 2012-11-14T21:52:23.740 に答える
2

変数iは反復ごとにリセットされません。再帰的に実行される唯一のアクションは、ブール式 andi++です。node.hide()と同じではありませんthis.hide()。後者は呼び出される別の関数です。それが同じ関数である場合、はい、無限ループが発生します。

内のすべての要素を「非表示」にするために、「外側の」非表示機能が使用されていthis.getChild(i)ます。node.hide()これらの要素でメソッドを呼び出して、hide()それらを非表示にします。node.hide()は、使用されている関数と同じ名前ですが、同じ関数ではないため、無限ループはありません。

于 2012-11-14T21:53:00.277 に答える
0
  1. コード

    node.hide();

    まだツリーのメンバーであり、まだトラバース可能です。表示されないように隠されているだけです。

  2. for ループの初期化部分

    var node, i=0

    ループが始まる前に一度だけ実行されます。

  3. 条件付き

    node = this.getChild(i)

    子ノードがある場合は true (null 以外) と評価され、子孫がなくなると false (null) と評価され、ループから抜け出します。

于 2012-11-14T21:53:51.850 に答える
0

に子がない場合igetChildは戻りundefined、ループから抜け出します。

記事の次のテキストを検討してください。

GalleryImage クラスを作成します。GalleryComposite とまったく同じメソッドをすべて使用していることに注意してください。言い換えれば、それらは同じインターフェースを実装しますが、画像は葉であるため、子に関するメソッドに対して実際には何もしません。複合要素は別の複合要素を追加するのかリーフを追加するのかを認識しないため、複合要素が機能するには同じインターフェイスを使用する必要があります。

のコンストラクタを考えてみましょうGalleryImage:

var GalleryImage = function (src, id) {
  this.children = [];

  this.element = $('<img />')
  .attr('id', id)
  .attr('src', src);
}

そして、画像と合成物がどのように構築されるか:

var container = new GalleryComposite('', 'allgalleries');
var gallery1 = new GalleryComposite('Gallery 1', 'gallery1');
var gallery2 = new GalleryComposite('Gallery 2', 'gallery2');
var image1 = new GalleryImage('image1.jpg', 'img1');
var image2 = new GalleryImage('image2.jpg', 'img2');
var image3 = new GalleryImage('image3.jpg', 'img3');
var image4 = new GalleryImage('image4.jpg', 'img4');

gallery1.add(image1);
gallery1.add(image2);

gallery2.add(image3);
gallery2.add(image4);

container.add(gallery1);
container.add(gallery2);

画像には子を含めることができないためthis.children、空の配列のままになります。そのため、hide関数が最終的に画像 (複合ツリーの葉の 1 つ) で呼び出されると、ループはthis.children[0]どちらが を返すかを評価しようとしundefinedます。これにより、コードnode = this.getChild(i)が「false」値に評価され、その特定のforループが終了します。したがって、無限ループを防ぎます。

于 2012-11-14T21:54:00.803 に答える