新来的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错误。所以我想是内存溢出什么的。
发布于 2018-04-29 09:51:03
您的i是全局变量。始终使用const或let (或var)声明变量,以避免全局污染和意外行为(如这里发生的情况)。
每次运行generateTuple时,i都会在generateTuple中的for循环末尾被设置为3。因此,引用相同全局变量的i从没有机会超过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));
发布于 2018-04-29 09:48:54
您正在创建全局i,方法是声明它而不带var或let,然后使用它循环。这为i创建了前所未有的值,导致循环永远不会完成。正确地声明变量。
for(var i=0;i<num;i++) // better: let i = 0; ...和
for(var i=0;i<3;i++) // better: let i = 0; ...https://stackoverflow.com/questions/50085248
复制相似问题