javascript尾递归优化

本文深入探讨JavaScript中的递归,分析递归过程中执行上下文栈的变化,解释尾递归优化的概念,通过实例展示了如何进行优化,并讨论了优化的条件。最后,探讨了最新浏览器对尾递归的支持和优化的效果。
摘要由CSDN通过智能技术生成

JS中的递归

我们来看一个阶乘的代码
function foo( n ){
   
  if(n <= 1){
   
    return 1;
  }
  return n * foo( n - 1 );
}

foo(5);  // 120

下面分析一下,代码运行过程中,执行上下文栈是怎么变化的
  1. 这个代码是在全局作用域中执行的,所以在foo函数得到执行之前,上下文栈中就已经被放入了一个全局上下文。之后执行一个函数,生成一个新的执行上下文时,JS引擎都会将新的上下文push到该栈中。如果函数执行完成,JS引擎会将对应的上下文上下文栈中弹出

  2. 一开始执行foo函数的时候,JS引擎会创建foo的执行上下文,将该执行上下文push进上下文栈。然后开始执行foo中的代码。

在这里插入图片描述

现在上下文栈中已经有了两个执行上下文了

  1. 在执行到foo中代码快结束时,return表达式中,又调用了foo函数。所以又会创建一个新的执行上下文。并且JS引擎会把这新的执行上下文push到上下文栈中。

在这里插入图片描述

现在上下文栈中已经有了三个执行上下文了

  1. 开始重复第3步的执行。一直到n<=1,才不会有新的执行上下文产生。

此刻上下文栈中,已经有了6个上下文了(包含了全局上下文)

在这里插入图片描述

设想一下
  1. 如果刚开始调用的时候,传入n的初始值为100,到n<=1时,上下文栈中会有几个上下文。101个。
  2. 如果初始值为1000呢?到n<=1时,会有1001个执行上下文
  3. 也就是说,传入的初始值越大,执行上下文栈中,就会有越多的执行上下文🥲
  4. 对于上下栈,它的空间是有限的,一旦存放的上下文占用内存产出了它的最大内存,就会出现栈溢出。RangeError: Maximum call stack size exceeded
  5. 而在chrome中,不仅会对栈的空间有限制,还会对函数的递归次数有限制

递归优化

我们来看一个样例代码
function outer() 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值