2018-01-26 js尾调用

1.在js中使用递归的时候,有可能会栈溢出,因为浏览器调用栈有上限限制,具体可以用以下代码测出当前浏览器所能用的最大栈的数量

var i = 0;
function recursiveFn () {
          i++;
          recursiveFn();
}

try {
        recursiveFn(); 4
} catch (ex) {
      alert('i = ' + i + ' error: ' + ex);
}

2.但是当我们确实有需要用到递归的时候有没有更好的解决办法呢,其实是有的,es6中的一个特性-尾递归就可以很好的解决这个问题,

原理

  • 常规递归中,我们是保存整个调用栈,比如A函数里面调用了B函数,B函数又调用了C函数,那么现在调用栈就会是 |C|B|A C,B依次执行完之后才能返回A的值,
  • 而尾递归中,我们是复用栈的,比如执行C,B这段之后,执行完C后就会销毁C的内容,B里保存C刚才执行完的值,那么流程就是,先C|B,这样执行后,变成B|A,我们用有限的栈空间完成了递归过程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,882评论 0 38
  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,673评论 1 19
  • 你必须培养一些爱好,不要空洞遥远的目标而是实在甚至庸俗的吃喝拉撒。必须一觉醒来很清楚至少今天还能干什么。去楼下最辣...
    俊橙迪尼奥阅读 195评论 0 0
  • 今天是冬至,24节气中的冬至。 冬至大过年。外出的人回来了,上班的人急着回家。家里有热腾腾的饺子,汤圆,还有喷香的...
    梅森刘阅读 233评论 1 1
  • 梦幻彩虹❤ 在后台的单洁洁听了几遍就没有再听下去了,一星期内妈妈已经让自己听的耳朵出茧子了。化妆老师在给庄宇杰理发...
    雪团团阅读 338评论 0 1