Javascript 闭包中的 var 总是包含相同的元素?

Javascript a var in closure always contain the same element?

请参阅此处 fiddle JSFIDDLE

var combine = function(n, k) {

    function backtracking(n, k) {
        if(k){  // min(k)=1, when k=0 break
            for(var i=1; i<=n; ++i){
                if(!used[i]){
                    used[i] = true;
                    solution[k-1] = i;  // solution.length=k
                    // console.log(solution.length);
                    arguments.callee(n, k-1);
                    used[i] = false;
                }
            }
        }else{
            console.log(solution);
            return result.push(solution);    // ?
        }
    }

    var used = [],
        result = [],
        solution = [];
    if(k>n){
        return [];
    }else{
        backtracking(n, k);
    }

    return result;
};

var b = combine(4, 2);
console.log(b);

为什么结果数组总是包含相同的元素>我的意思是它应该与数组解决方案具有相同的值?

b 输出:

[[3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4]]

我期望这样:

[[2, 1], [3, 1], [4, 1], [1, 2], [3, 2], [4, 2], [1, 3], [2, 3], [4, 3], [1, 4], [2, 4], [3, 4]]

我猜这是一个闭包问题。但是我该怎么做呢???

我尝试将 result[] 作为全局 var.but 仍然不起作用..

我看到了 post。但它是在一个循环中关闭的。但这不是由循环问题引起的。循环实际上有效 fine.It 是闭包中的递归问题..

当你打电话时:

  return result.push(solution);

您仍在再次使用同一个 Array 对象,以后对该对象的任何更改都将保留在结果上。 每次将其推送到结果时,您都需要克隆解决方案对象:

  return result.push(solution.slice(0));

这是新的 Fiddle:Fiddle