js尾调用优化

create on in javascript with 0 comment and 63 view

什么是尾调用

在一个函数中,执行的最后一个语句为函数调用,那么该情况则称为尾调用。

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

下面两种情况都不是尾调用。

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

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

虽然结果一致,但是调用时还做了其它的操作。

尾调用的好处

在函数中,非尾调用的情况下,当函数中进行另一个函数的调用时,当前堆栈会存储函数的调用记录,并将当前堆栈信息暂存起来,而当出现上百成千次的函数调用时,就很容易发生栈溢出。
若使用尾调用的好处是,当前堆栈信息可不用保存起来,所有调用都只会产生一次调用记录,这样就能避免栈溢出了。

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

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

// 等同于
g(3);

所以,平时在写递归函数时,应该尽量使用尾部调用,也称之为尾递归。

参考博客

😁😂😃😄😅😆😇😈😉😐😑😒😓😔😕😖😗😘😙😠😡😢😣😤😥😦😧😨😩😰😱😲😳😴😵😶😷😸😹🙀🙁🙂🙃🙄🙅🙆🙇🙈
🙂