关于尾调用的优化-----------------摘录

摘自《ECMAScript6入门》第七章

何为尾调用

function f(x){
  return g(x);
}

最后一步调用函数g,叫尾调用

下列情况不属于尾调用

// 情况一
function f(x){
  let y = g(x);
  return y;
}

// 情况二
function f(x){
  return g(x) + 1;
}

// 情况三
function f(x){
  g(x);
}

使用尾调用时,因为其是函数的最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置、内存变量等信息都不会再用到了,只要直接用内层函数的调用记录,取代外层函数的调用记录就可以了。

function f() {
  let m = 1;
  let n = 2;
  return g(m + n);
}
f();

// 等同于
function f() {
  return g(3);
}
f();

// 等同于
g(3);

如果所有函数都是尾调用,那么可以使每次执行时,调用记录只有一项,这会节省大量内存。

注:只有不再用到外层函数的内部变量,内层函数的调用记录才会取到外层函数的调用记录,否则无法进行“尾调用优化”。

function addOne(a){
  var one = 1;
  function inner(b){
    return b + one;
  }
  return inner(a);
}

上面的函数不会进行尾调用优化,因为内层函数inner使用了外层函数addOne的one变量。

转载于:https://www.cnblogs.com/FreezeNow/p/10646991.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值