定义

函数的最后一步操作调用另一个函数

  1. function f(x) {
  2. return g(x)
  3. }
  4. // 以下不算尾调用
  5. 1) 赋值操作
  6. function f(x) {
  7. let y = g(x)
  8. return y
  9. }
  10. 2) 调用函数后,还有其它操作
  11. function f(x) {
  12. return g(x) + 1
  13. }
  14. 3) 最后一步隐性调用 return undefind
  15. function f(x) {
  16. g(x)
  17. }

实质

只保留内层函数的调用帧,不保留外层函数的调用帧,节省内存

注意

只有不需要用到外层函数的内部变量,才能取消外层函数的调用帧,否则不能进行尾调用优化。

  1. function addOne(a) {
  2. var one = 1;
  3. function inner(b) {
  4. return b + one
  5. }
  6. return inner(a)
  7. }

不会进行尾调用优化,应为内层函数inner 用到了外层函数addOne 内部的变量one.