这里是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错误。所以我认为这是一些内存溢出或某处。
答案 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
是全局变量。始终使用const
或let
(或var
)声明变量,以避免全局污染和意外行为(例如此处发生的事情)。
每次运行generateTuple
时,i
在for
的{{1}}循环结束时设置为3。因此,generateTuple
引用的i
- 引用相同的全局变量 - 从来没有机会获得高于4.因此,如果您使用更高的数字调用generateList
,那么&#39} ;得到一个无限循环。
只需正确声明变量:
generateList
&#13;