这里是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错误。所以我认为这是一些内存溢出或某处。
最佳答案
您的i
是全局变量。始终使用const
或let
(或var
)声明变量,以避免全局污染和意外行为(如此处发生的情况)。
每次运行generateTuple
时,在i
中for
循环的末尾,generateTuple
都设置为3。因此,由i
引用的generateList
-引用相同的全局变量-永远都没有机会获得大于4的值。因此,如果以更大的数字调用generateList
,则会出现无限循环。
只需正确声明变量即可:
function generateList(num){
var arr = [];
for(let i=0;i<num;i++){
arr.push(generateTuple());
}
return arr;
}
function generateTuple(){
var tuple = [];
for(let i=0;i<3;i++){
tuple.push(Math.floor(Math.random() * 300));
}
return '(' + tuple[0] + ',' + tuple[1] + ',' + tuple[2] + ')';
}
console.log(generateList(10));