尾调用优化的条件
- 尾调用优化的条件就是确定外部栈帧真的没有必要存在了。
- 代码在严格模式下执行;
- 外部函数的返回值是对尾调用函数的调用;
- 尾调用函数返回后不需要执行额外的逻辑;
- 尾调用函数不是引用外部函数作用域中自由变量的闭包
下面展示了几个违反上述条件的函数,因此都不符合尾调用优化的要求:
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(); }
|