这里是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是全局变量。始终使用constlet(或var)声明变量,以避免全局污染和意外行为(如此处发生的情况)。

每次运行generateTuple时,在ifor循环的末尾,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));

10-07 19:08