[js] 举例说明js中什么是尾调用优化
[js] 舉例說明js中什么是尾調(diào)用優(yōu)化
上次介紹了什么是尾調(diào)用以及怎么準(zhǔn)確快速的判別一個函數(shù)調(diào)用是否為尾調(diào)用。那么,我們判別尾調(diào)用的意義是什么呢?做什么事情總歸有個目的,那么今天我們就來系統(tǒng)的介紹一下尾調(diào)用的意義,或者說尾調(diào)用有什么用吧。
2. 尾調(diào)用優(yōu)化
我們知道,函數(shù)的調(diào)用會在內(nèi)存中生成一個“調(diào)用幀”(call frame),保存著函數(shù)的調(diào)用位置和內(nèi)部變量等信息。如果在函數(shù)A的內(nèi)部調(diào)用函數(shù)B,那么在A的調(diào)用幀上方還會生成一個B的調(diào)用幀。等到函數(shù)B運(yùn)行結(jié)束,將結(jié)果返回到A,B的調(diào)用幀才會消失。如果函數(shù)B的內(nèi)部還調(diào)用函數(shù)C,那么在B的調(diào)用幀上方又會生成一個C的調(diào)用幀,以此類推。所有的調(diào)用幀就形成了一個“調(diào)用棧”(call stack)。
我們知道,尾調(diào)用是函數(shù)的最后一步操作,外部函數(shù)的調(diào)用位置和其內(nèi)部變量信息都不會再用到了,所以不需要保留外部函數(shù)的調(diào)用幀了,直接用內(nèi)層函數(shù)的調(diào)用幀取代外層函數(shù)的調(diào)用幀即可。
如果所有的函數(shù)都是尾調(diào)用,那么完全可以做到每次執(zhí)行時的調(diào)用幀只有一項(xiàng),這將大大的節(jié)省內(nèi)存,更不可能發(fā)生內(nèi)存溢出,這就是討論尾調(diào)用的意義所在。
所謂的“尾調(diào)用優(yōu)化”,其實(shí)就是保證在函數(shù)執(zhí)行時只保留內(nèi)層函數(shù)的調(diào)用幀,換句話說,就是用內(nèi)層函數(shù)的調(diào)用幀取代外部函數(shù)的調(diào)用幀,即執(zhí)行時內(nèi)存中只保存一項(xiàng)調(diào)用幀。
3. 如何做到尾調(diào)用優(yōu)化
通過上面的討論,我們知道了,只要外部函數(shù)的調(diào)用幀被內(nèi)層函數(shù)的調(diào)用幀取代即可做到“尾調(diào)用優(yōu)化”。同時,我們也知道調(diào)用幀是用來保存函數(shù)調(diào)用位置和內(nèi)部變量信息的,所以,要想讓內(nèi)層函數(shù)的調(diào)用幀取代外部函數(shù)的調(diào)用幀,只需要保證,在調(diào)用內(nèi)層函數(shù)時,不再用到和外部函數(shù)有關(guān)的一切信息即可(不再用到外部函數(shù)的內(nèi)部變量)。
如此,我們總結(jié)出只有內(nèi)層函數(shù)在被調(diào)用時不再用到外部函數(shù)的內(nèi)部變量,才能做到“尾調(diào)用優(yōu)化”。
先來,看一個例子:
function f(a) {var b = 3;function g(n) {return n + b}return g(a) }上述例子,我們明顯可以看出這是典型的尾調(diào)用,那么這有沒有做到“尾調(diào)用優(yōu)化”呢?很明顯,可以看出在調(diào)用內(nèi)部函數(shù)g的時候,其內(nèi)部用到外部函數(shù)f 的內(nèi)部變量b,故在函數(shù)g 被調(diào)用時,g 的調(diào)用幀并不能取代外部函數(shù)f 的調(diào)用幀,所以這不是“尾調(diào)用優(yōu)化”。
個人簡介
我是歌謠,歡迎和大家一起交流前后端知識。放棄很容易,
但堅持一定很酷。歡迎大家一起討論
主目錄
與歌謠一起通關(guān)前端面試題
總結(jié)
以上是生活随笔為你收集整理的[js] 举例说明js中什么是尾调用优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java课程设计-学生成绩管理系统
- 下一篇: 飞机大战一Java课程设计