首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript OOM错误

Javascript OOM错误
EN

Stack Overflow用户
提问于 2018-04-29 09:42:12
回答 2查看 832关注 0票数 1

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

代码语言:javascript
复制
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,如果我只是个别地生成随机数并返回它们(而不是使用列表),它就能正常工作。有人能告诉我这是怎么回事吗?

代码语言:javascript
复制
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错误。所以我想是内存溢出什么的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-29 09:51:03

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

每次运行generateTuple时,i都会在generateTuple中的for循环末尾被设置为3。因此,引用相同全局变量的i从没有机会超过4。因此,如果用更高的数字调用generateList,就会得到一个无限循环。

只需正确地声明变量:

代码语言:javascript
复制
 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));

票数 1
EN

Stack Overflow用户

发布于 2018-04-29 09:48:54

您正在创建全局i,方法是声明它而不带var或let,然后使用它循环。这为i创建了前所未有的值,导致循环永远不会完成。正确地声明变量。

代码语言:javascript
复制
for(var i=0;i<num;i++) // better: let i = 0; ...

代码语言:javascript
复制
for(var i=0;i<3;i++) // better: let i = 0; ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50085248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档