1、什么是尾部调用?
尾部调用就是外部函数的返回值是另一个内部函数的返回值
2、尾部调用优化有什么好处?
function outsideFunction () {
return innerFunction()
}
innerFunction () {
return 'hello'
}
outsideFunction()
在上述代码中,在ES5语法中,这两个函数的执行过程是
1、执行outsideFunction函数体,outsideFunction入栈
2、outsideFunction执行到return语句中的时候,返回值必须要先计算innerFunction
3、执行innerFunction, innerFunction入栈
4、innerFunction执行返回后,innerFunction出栈
5、outsideFunction出栈,执行完毕
在ES6语法中,这两个函数的执行过程是
1、执行outsideFunction函数体,outsideFunction入栈
2、outsideFunction执行到return语句中的时候,检测到返回值与innerFuntion的返回值一致,outsideFunction出栈
3、执行innerFunction,innerFunction入栈
4、innerFunction执行返回后,innerFunction出栈,执行完毕
那么在上面的例子中可以看到,在ES5语法中,每多一个嵌套函数都要多一个栈帧,而在ES6中无论有多少个嵌套函数仅仅只有一个栈帧。那么,ES6尾调用优化的关键在于:如果函数的逻辑允许基于尾调用将其删除,那么引擎就会去操作删除
3、尾部调用优化的条件?
- 1、在严格模式下进行
- 2、尾部调用只允许返回函数,不能对返回的函数进行逻辑操作
- 3、外部函数的返回值是对尾调用函数的调用
- 4、外部函数的返回值不能是其外部函数的自由变量或者闭包 ps: 在严格模式下进行是因为在非严格模式下,arguments.caller会引用外部函数的栈帧,如果引用了外部函数的栈帧,则优化毫无意义