阅读 68

函数尾部调用优化

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会引用外部函数的栈帧,如果引用了外部函数的栈帧,则优化毫无意义

文章分类
前端
文章标签