javascript max call stack超出解释

时间:2012-10-31 10:30:51

标签: javascript recursion multidimensional-array

var MultiArray = (function(){

    var MultiArray = function(param){

            var i = param.array.length;
            while(i--){
                param.array[i] = MultiArray({
                array: new Array(dims[0]),
                dims: dims.splice(1,dims.length-1)
                });
            }

        return param.array

    };

    return function(){

        var length = arguments.length - 1;
            array = new Array(arguments[0]),
            dims = [length];

        for(var i = 0; i < length; i++){
            dims[i] = arguments[i+1];
        }   

        MultiArray({
            array: array,
            dims: dims
        });

        return array;
    };

})();

我正在尝试编写一个将创建多维数组的函数,以便var mdArray = MultiArray(3,3,3);创建一个3x3x3元素的3D数组。但是在尝试这种方法时我得到Max调用堆栈大小,是否有更好的方法来制作这样的多维数组函数?

2 个答案:

答案 0 :(得分:0)

在你的内心MultiArray中,你总是有一个param.array有一个项目,这会产生无休止的递归。

答案 1 :(得分:0)

var MultiArray = (function() {

    var MultiArray = function(param) {

        var myDims, i = param.array.length;
        if(param.dims.length === 0){
            return;
        }
        while(i--) {
            myDims = param.dims.slice(0);
            myDims = myDims.splice(1, myDims.length - 1);
            param.array[i] = new Array(param.dims[0]);
            MultiArray({
                array : param.array[i],
                dims : myDims
            });
        }

    };

    return function() {

        var length = arguments.length - 1, array = new Array(arguments[0]), dims = [length];

        for(var i = 0; i < length; i++) {
            dims[i] = arguments[i + 1];
        }

        MultiArray({
            array : array,
            dims : dims
        });

        return array;
    };
})();

上面的代码是正确的,原始代码完全错误导致无限递归循环,现在它按预期工作,var mdArray = MultiArray(2,3,4,5);创建一个尺寸为2x3x4x5的数组。当参数中的dims数组长度为零时,递归函数现在立即返回。