• 外部函数的返回值是一个内部函数的返回值。

尾调用优化的条件

  • 尾调用优化的条件就是确定外部栈帧真的没有必要存在了
    • 代码在严格模式下执行;
    • 外部函数的返回值是对尾调用函数的调用;
    • 尾调用函数返回后不需要执行额外的逻辑;
    • 尾调用函数不是引用外部函数作用域中自由变量的闭包

下面展示了几个违反上述条件的函数,因此都不符合尾调用优化的要求:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
"use strict"; 
// 无优化:尾调用没有返回
function outerFunction() {
innerFunction();
}
// 无优化:尾调用没有直接返回
function outerFunction() {
let innerFunctionResult = innerFunction();
return innerFunctionResult;
}
// 无优化:尾调用返回后必须转型为字符串
function outerFunction() {
return innerFunction().toString();
}
// 无优化:尾调用是一个闭包
function outerFunction() {
let foo = 'bar';
function innerFunction() { return foo; }
return innerFunction();
}

下面是几个符合尾调用优化条件的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"use strict"; 
// 有优化:栈帧销毁前执行参数计算
function outerFunction(a, b) {
return innerFunction(a + b);
}
// 有优化:初始返回值不涉及栈帧
function outerFunction(a, b) {
if (a < b) {
return a;
}
return innerFunction(a + b);
}
// 有优化:两个内部函数都在尾部
function outerFunction(condition) {
return condition ? innerFunctionA() : innerFunctionB();
}