尾调用优化(Tail Call Optimization,TCO)是**es6新增的**系统的引擎优化。
#概念
尾调用指的:是一个函数作为另一个函数的最后一条语句被调用,这个调用结束之后就没有其余事情要做了(除了可能要返回结果值)eg:
#为什么要有尾调用优化?
在程序运行时,计算机会为应用程序分配一定的内存空间;应用程序则会自行分配所获得的内存空间,其中一部分被用于记录程序中正在调用的各个函数的运行情况,这就是函数的调用栈。常规的函数调用总是会在调用栈最上层添加一个新的堆栈帧(stack frame,也翻译为“栈帧”或简称为“帧”),这个过程被称作“入栈”或“压栈”(意即把新的帧压在栈顶)。
js在调用函数时,会创建一个新的栈帧,将调用的函数推入调用栈来表示函数调用,也就是说在循环调用时调用栈变得过大造成内存溢出。尾调用优化机制就解决了这一问题。
(如上图所示,h()执行结束时也意味着g()的结束,所以h不需要创建新的栈帧而是重复使用g的栈帧)
#满足以下条件时尾调用优化执行(不再创建新的栈帧而是清除并重用当前栈帧)
1.尾调用不访问当前栈帧的变量,就是说函数不是一个闭包。
2.在函数内部,尾调用是最后一条语句。
3.尾调用的结果作为函数值返回
满足以上三种条件会被js引擎自动优化。
#尾调用优化用途
当我们写递归函数时,可以利用尾递归优化的特性,如果递归函数计算量足够大,尾递归优化可以大幅度提升程序的性能。
##一个例子
阶乘函数