尾調(diào)用優(yōu)化(Tail Call Optimization)
標(biāo)簽:
JavaScript
什么是尾调用
- 尾调用指“函数尾调用”。
- 尾调用是函数式编程的一个重要概念。
- 尾调用就是某个函数最后一步是调用另一个函数
这就是一个尾调用。
// 函数 f 最后一步调用函数 g,这就是尾调用
function f(x) {
return g(x);
}
尾调用不一定出现在函数尾部,只要是最后一步操作即可。
// x 等于 5 时,返回 m(x) 的结果,虽然位置不在函数尾部,但是
// 是最后一步操作
function f(x) {
if (x > 0) {
return m(x);
}
return n(x);
}
f (5) ;
尾调用优化
尾调用优化是对内存使用的优化,结果是节省内存,你可能察觉不到。
举个例子
function f() {
let m = 1;
let n = 2;
return g(m + n);
}
f();
函数 f
最后一步调用函数 g
。可以看到,函数 g
被调用时(即 g(3)
),已经不依赖父函数 f
中的变量了,那么就可以将函数 f
在内存中占用的空间清除,这就是“尾调用优化”!
你可能想不到,在 ES6 之前,如果子函数运行在内存,那么父函数非得等到子函数运行结束、从内存清除后,才会从内存清除。
无法进行“尾调用优化”的例子function addOne(a) {
var one = 1;
function innner(aa) {
return aa + one;
}
innner(a);
}
函数 addOne
的最后一步,调用了内部定义的函数 innner
,innner
函数执行。但 innner
内部引用了外部变量 one
,导致执行 innner
时,addOne
必然还在内存里。
这就无法进行“尾调用优化”了。
参考资料: 《ECMAScript 6 入门》之 尾调用优化,by 阮一峰
(完)
點(diǎn)擊查看更多內(nèi)容
為 TA 點(diǎn)贊
評論
評論
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦