在递归函数中限制for循环中变量的范围

时间:2015-04-15 16:30:32

标签: javascript recursion scope

我有一个递归函数,我正在尝试创建一个数组,这个数组对于递归中的for循环创建的每个“线程”都是不同的。

我有一个例子如下。在函数的初始传递中,变量idsundefined。我将它设置为一个空数组,并将传递给该函数的id推送到该数组。在示例中,这使ids数组等于[2]

函数中的for循环以递归方式调用提供的函数id大于0.在for循环的第一遍中,使用recursiveFunction调用(2-1,[2]);

此调用看到ids不是undefined,并将1添加到构成数组[2,1]的数组中。函数的第二次传递仅在调用recursiveFunction(1-1,[2,1])时执行for循环。

我们现在进入函数的第3遍,它向数组追加零,因此数组现在为[2,1,0]。这结束了函数第一次运行中for循环的第一次运行。

我们现在回到函数原始调用中for循环的第二次运行。当我们离开它时,数组ids[2],但是,当我们记录它时,我们可以看到递归已经影响了数组的内容。这是有道理的,因为递归会影响数组,因为它被提升了。

我试图找到一种避免这种情况的方法,以便在递归完成时,第一次ids数组为[2,1,0],第二次也为[2,1,0]。目前,它是[2,1,0]然后[2,1,0,1,0]

我正在尝试做什么?也许有一个我应该考虑的解决方法。这是代码。

outerFunction = function recursiveFunction (id,ids) {

    if (typeof ids === 'undefined') {
        ids = [];
    }

    ids.push(id);

    for(var i=0;i<id;i++) {

        recursiveFunction(id-1,ids);
    }

    if (id === 0) {
        console.log('id is zero and ids is: ' + ids);
    }
 }

 outerFunction(2);

这是小提琴:http://jsfiddle.net/hzLm4rbq/

1 个答案:

答案 0 :(得分:2)

您需要在函数的每次调用中复制数组,否则所有参数都引用相同的数组(并修改它)。您可以使用Array slice method

function recursiveFunction (id,ids) {
    if (typeof ids === 'undefined')
        ids = [];
    else
        ids = ids.slice(); // copy

    ids.push(id);
    for (var i=0; i<id; i++)
        recursiveFunction(id-1, ids);

    if (id === 0)
        console.log('id is zero and ids is: ' + ids);
}

现在,如果在数组中包含循环的i,则会得到不同的输出。