1

だから私はjavasciptスコーピングとプロトタイプエリアの崖から落ちたと思います。オブジェクトから単純なツリー構造を構築しようとしています。木を作るのは問題ありませんが、子供たち全員を集めようとすると、子供たちをつなぎ合わせることができないようです。コードを調べましたが、奇妙なスコープの問題が発生しているようで、理解できません。これは私が持っているコードです:

var Foo = function (value) {
    this.value = value;
    this.children = [];
}

Foo.prototype.getAllChildren = function () {
    var childs = [];
    for (var i = 0; i < this.children.length; i++) {
        childs.push(this.children[i]);
        childs.concat(this.children[i].getAllChildren());
    }
    return childs;
};

var foo1 = new Foo(1),
    foo2 = new Foo(2),
    foo3 = new Foo(3);

foo1.children.push(foo2);
foo2.children.push(foo3);

var children = foo1.getAllChildren(),
    expected = foo1.children.concat(foo2.children);

上記のコードの結果を示すフィドルをここに作成しましたhttp://jsfiddle.net/e2zf8/1/

getAllChildren関数は、2つのFooのリストを返す必要がある場合にのみ、foo1に対して1つのFooを含むリストを返します。(はい、FooはFooの複数形です)。再帰、スコープ、プロトタイプスコープと関係があるようです。私は自分の間違いを正確に特定できないようで、どんな助け(または私の問題)も役に立ちます。

4

1 に答える 1

3

いいえ、スコーピングにもプロトタイプにも問題はありません。

arrayconcatメソッドのみが、適用されている配列を変更せず、連結された新しい配列を返します。コードはchilds変更されません。2つの可能性:

  • 毎回新しい配列でchilds = childs.concat(…)上書きするために使用しますchilds
  • ループまたはを使用して、それぞれを配列にプッシュgetAllChildrenします。childs[].push.apply(childs, this.children[i].getAllChildren())
于 2013-03-13T17:11:06.523 に答える