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

Limiting scope of variable within for loop on recursive function

我有一个递归函数,我正在尝试创建一个数组,该数组对于递归中的 for 循环创建的每个 "thread" 都是不同的。

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

函数中的for循环递归调用函数,前提是id大于0。在for循环的第一遍中,recursiveFunction(2-1,[2])调用;

此调用发现 ids 不是 undefined,并将 1 添加到数组,从而形成数组 [2,1]。函数的第 2 遍仅在调用 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);

这是fiddle:http://jsfiddle.net/hzLm4rbq/

您需要在每次调用函数时复制数组,否则所有参数都引用同一个数组(并修改它)。您可以为此使用 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 合并到数组中,您将获得不同的输出。