作为一名多年前端开发的资深码农,一直对于堆啊和栈啊什么的不屑一顾,平时工作中while使用的很少,用递归反而多点,在最近无意中的一个计算操作中发现了在js中递归的缺点,然后自己做了个实验:
显示用递归
// 递归
let num = 0;
const max = 1000000;
function a () {
num++;
console.log(`当前循环次数:${num}`);
if (num === max) {
return false;
} else {
return a();
}
}
setTimeout(() => {
a();
}, 100);
结果:
显示堆栈溢出了,用while来操作:
let num = 0;
const max = 1000000;
// while循环
while (num !== max) {
num++;
console.log(`当前循环次数:${num}`);
}
直接一步到位:
后来在网上查了下,Aleph先生指出,在V8中,递归调用的数量取决于两个量:堆栈的大小和堆栈帧(保存参数的局部变量)的大小。你可以通过在 computeMaxCallStackSize() 添加局部变量进行验证 - 它会返回低位值。
用一下函数找出答案:
function computeMaxCallStackSize() {
try {
return 1 + computeMaxCallStackSize();
} catch (e) {
// Call stack overflow
return 1;
}
}
三个结果:
Node.js: 11034
Firefox: 50994
Chrome: 10402
看了其他博主的也有相似的经历,有给出的方案跟本文一样,用循环来带来递归,也有说es6优化的有这方面,但是我暂时没有试成功,如有大神还望指点一二。