Javascript原型范围和递归问题

时间:2013-03-13 17:06:35

标签: javascript recursion prototype concat

所以我想我已经从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函数只返回一个foo1的Foo1列表,它应该返回两个Foo的列表。 (是Foo是Foo的复数)。它似乎与递归,范围和原型范围有关。我似乎无法查明我的错误,任何帮助(或我的问题)都会有所帮助。

1 个答案:

答案 0 :(得分:3)

不,既没有范围也没有原型问题。

只有array concat method不会修改它应用的数组,但会返回连接的新数组。您的代码保持childs不变。两种可能性:

  • 每次使用新阵列
  • 时,使用childs = childs.concat(…)覆盖childs
  • 使用循环或getAllChildren将每个childs推送到[].push.apply(childs, this.children[i].getAllChildren())数组。