【问题标题】:javascript max call stack exceeded explanationjavascript max call stack exceeded 解释
【发布时间】:2012-10-31 10:30:51
【问题描述】:
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 call stack size exceeded,有没有更好的方法来制作这样的多维数组函数?

【问题讨论】:

    标签: javascript recursion multidimensional-array


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:
      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 数组长度为零时,递归函数会立即返回。

      【讨论】:

        猜你喜欢
        • 2015-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多