Javascript OOM错误

时间:2018-04-29 09:42:12

标签: javascript

这里是JS的新手,所以如果我遗漏了一些明显的东西,我会道歉。试图建立一个随机数生成器(它以嵌套的方式工作,所以类似于随机数元组的列表),但是我得到了这个代码的OOM错误。 (比方说,如果我尝试做类似generateList(6)的事情)

function generateList(num){
  var arr = [];
  for(i=0;i<num;i++){
    arr.push(generateTuple());
  }
  return arr;
}

function generateTuple(){
  var tuple = [];

  for(i=0;i<3;i++){
    tuple.push(Math.floor(Math.random() * 300));
  }
  return '(' + tuple[0] + ',' + tuple[1] + ',' + tuple[2] + ')';
}

OTOH,如果我只是单独生成随机数并返回它们(而不是使用列表),它可以正常工作。谁能告诉我这里发生了什么?

function generateTuple(){
    var a = Math.floor(Math.random() * 300);
    var b = Math.floor(Math.random() * 300);
    var c = Math.floor(Math.random() * 300);


    return '(' + a + ',' + b + ',' + c + ')';
}

编辑:所以基本上如果你运行代码,它会陷入某种循环,并在控制台中一段时间​​后返回OOM错误。所以我认为这是一些内存溢出或某处。

2 个答案:

答案 0 :(得分:2)

您通过声明没有var或let来创建全局i,然后循环使用它。这为i创造了前所未有的价值,导致循环永远不会完成。正确声明你的变量。

for(var i=0;i<num;i++) // better: let i = 0; ...

for(var i=0;i<3;i++) // better: let i = 0; ...

答案 1 :(得分:1)

您的i是全局变量。始终使用constlet(或var)声明变量,以避免全局污染和意外行为(例如此处发生的事情)。

每次运行generateTuple时,ifor的{​​{1}}循环结束时设置为3。因此,generateTuple引用的i - 引用相同的全局变量 - 从来没有机会获得高于4.因此,如果您使用更高的数字调用generateList,那么&#39} ;得到一个无限循环。

只需正确声明变量:

&#13;
&#13;
generateList
&#13;
&#13;
&#13;