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 函数应该返回一个包含两个 Foo 的列表时,它只为 foo1 返回一个包含一个 Foo 的列表。(是的,Foo 是 Foo 的复数形式)。它似乎与递归、作用域和原型作用域有关。我似乎无法确定我的错误,任何帮助(或我的问题)都会有所帮助。

4

1 回答 1

3

不,范围界定和原型都没有问题。

只有数组concat方法不会修改它所应用的数组,而是返回连接的新数组。您的代码childs保持不变。两种可能:

  • 用于每次用新数组childs = childs.concat(…)覆盖childs
  • 通过使用循环或.将每个推getAllChildren送到您的数组中。childs[].push.apply(childs, this.children[i].getAllChildren())
于 2013-03-13T17:11:06.523 回答