JS尾调用优化

尾调用优化(Tail Call Optimization,TCO)是**es6新增的**系统的引擎优化。

#概念

尾调用指的:是一个函数作为另一个函数的最后一条语句被调用,这个调用结束之后就没有其余事情要做了(除了可能要返回结果值)eg:

尾调函数
结果必须立即返回否则无法触发尾调用优化机制

#为什么要有尾调用优化?

在程序运行时,计算机会为应用程序分配一定的内存空间;应用程序则会自行分配所获得的内存空间,其中一部分被用于记录程序中正在调用的各个函数的运行情况,这就是函数的调用栈。常规的函数调用总是会在调用栈最上层添加一个新的堆栈帧(stack frame,也翻译为“栈帧”或简称为“帧”),这个过程被称作“入栈”或“压栈”(意即把新的帧压在栈顶)。


     js在调用函数时,会创建一个新的栈帧,将调用的函数推入调用栈来表示函数调用,也就是说在循环调用时调用栈变得过大造成内存溢出。尾调用优化机制就解决了这一问题。

(如上图所示,h()执行结束时也意味着g()的结束,所以h不需要创建新的栈帧而是重复使用g的栈帧)

#满足以下条件时尾调用优化执行(不再创建新的栈帧而是清除并重用当前栈帧)

1.尾调用不访问当前栈帧的变量,就是说函数不是一个闭包。

尾调用访问当前帧变量时不触发尾调用优化机制

2.在函数内部,尾调用是最后一条语句。

不是函数最后一条语句不触发尾调用优化

3.尾调用的结果作为函数值返回

不是直接返回

满足以上三种条件会被js引擎自动优化。

#尾调用优化用途

当我们写递归函数时,可以利用尾递归优化的特性,如果递归函数计算量足够大,尾递归优化可以大幅度提升程序的性能。

##一个例子

阶乘函数

普通函数
尾调优化的阶乘

你可能感兴趣的:(JS尾调用优化)