js的递归和while

作为一名多年前端开发的资深码农,一直对于堆啊和栈啊什么的不屑一顾,平时工作中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优化的有这方面,但是我暂时没有试成功,如有大神还望指点一二。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值