摘自《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变量。