Javascript原型范围和递归问题

Javascript原型范围和递归问题,javascript,recursion,prototype,concat,Javascript,Recursion,Prototype,Concat,因此,我认为我在javascipt范围界定和原型领域跌入了悬崖。我试图用对象构建一个简单的树结构。建树不是问题,但当我试图让所有的孩子们都来的时候,我似乎无法把他们团结在一起。我浏览了代码,似乎有一些奇怪的范围问题正在发生,我无法理解。这是我的代码: var Foo = function (value) { this.value = value; this.children = []; } Foo.prototype.getAllChildren = function () {

因此,我认为我在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);
var Foo=函数(值){
这个值=值;
这是:children=[];
}
Foo.prototype.getAllChildren=函数(){
var childs=[];
for(var i=0;i
我在这里创建了一个小提琴,显示了上面代码的结果


当getAllChildren函数应该返回两个Foo的列表时,它只返回一个Foo for foo1的列表。(yes Foo是Foo的复数形式)。它似乎与递归、作用域和原型作用域有关。我似乎无法指出我的错误,任何帮助(或我的问题)都会有帮助。

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

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

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

多么大的大脑屁啊。我没有意识到它只是返回了一份副本。我以为它像推一样工作。这实际上比我预期的要好。我当然会使用覆盖解决方案。有些数组方法会发生变异,有些则不会,这让人有点困惑。