JS新手求助:嵌套式随机数生成器调用generateList(6)触发OOM错误
解决嵌套随机数生成器的OOM内存溢出问题
嘿,刚看到你的问题啦!作为JS新手遇到这种内存溢出问题确实挺头疼的,我帮你梳理下问题根源和修复方案~
问题核心:全局变量导致的无限循环
你的代码里两个for循环中的i都没有用var、let或const声明,这会让i变成全局变量。当generateList调用generateTuple时,两个循环会共用同一个全局i,直接打乱了循环的正常逻辑,最终引发无限循环——数组会被不断填充元素,直到浏览器内存耗尽,抛出OOM错误。
举个简单的流程例子:
- 调用
generateList(6),全局i被设为0,进入第一次循环 - 执行
generateTuple(),里面的循环把全局i重置为0,加到3后退出循环,此时全局i是3 - 回到
generateList的循环,执行i++,全局i变成4,满足4<6继续循环 - 再次调用
generateTuple(),又把全局i重置为0,重复上述流程……循环永远无法走到i=6,数组会无限增长
修复后的代码
我帮你补上了变量声明和遗漏的返回语句,修复后代码如下:
function generateList(num){ var arr = []; // 用let声明局部变量i,避免全局污染 for(let i=0;i<num;i++){ arr.push(generateTuple()); } return arr; } function generateTuple(){ var tuple = []; // 同样用let声明局部变量i,和外部循环的i互不干扰 for(let i=0;i<3;i++){ tuple.push(Math.floor(Math.random() * 300)); } return tuple; // 你之前的代码漏了这个返回语句哦! }
关键修复点说明
- 用
let声明循环变量:let会创建块级作用域的变量,每个循环的i都是各自函数内的局部变量,不会互相干扰,保证两个循环都能正常执行指定次数。 - 补上
return tuple;:如果没有返回语句,generateTuple默认返回undefined,你生成的数组里会全是undefined,这个小疏漏也一起修正了。
现在调用generateList(6),应该能正常生成包含6个三元随机数组的列表啦,不会再出现内存溢出问题~
内容的提问来源于stack exchange,提问作者shem
相关产品推荐
相关产品推荐

