欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

es6函數(shù)之尾調(diào)用優(yōu)化實(shí)例分析

 更新時(shí)間:2020年04月25日 13:27:10   作者:wangliang_001  
這篇文章主要介紹了es6函數(shù)之尾調(diào)用優(yōu)化,結(jié)合實(shí)例形式分析了es6函數(shù)尾調(diào)用優(yōu)化相關(guān)功能、原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了es6函數(shù)之尾調(diào)用優(yōu)化。分享給大家供大家參考,具體如下:

什么是尾調(diào)用優(yōu)化?

尾調(diào)用是函數(shù)式編程的一個(gè)重要概念,本身非常簡單,一句話就能說清楚,就是指某個(gè)函數(shù)的最后一步是調(diào)用另一個(gè)函數(shù)。

function f(x) {
 return g(x)
}

上面代碼中,函數(shù)f的最后一步是調(diào)用函數(shù)g,這就叫尾調(diào)用。

以下三種情況,都不屬于尾調(diào)用。

// 情況一
function f(x) {
 let y = g(x)
 return y
}
// 情況二
function f(x) {
 return g(x) + 1
}
// 情況三
function f(x) {
 g(x)
}

尾調(diào)用不一定出現(xiàn)在函數(shù)尾部,只要是最后一步操作即可。

function f(x) {
 if (x > 0) {
  return m(x)
 }
 return n(x);
}

尾調(diào)用之所以與其他調(diào)用不同,就在于它的特殊的調(diào)用位置。

我們知道 ,函數(shù)調(diào)用會在內(nèi)存形成一個(gè)“調(diào)用記錄”,又稱調(diào)用幀,保存調(diào)用位置和內(nèi)部變量等信息。如果在函數(shù)A的內(nèi)部調(diào)用了函數(shù)B,那么在A的調(diào)用幀上方還會形成一個(gè)B的調(diào)用幀。等到B運(yùn)行結(jié)束,將結(jié)果返回A,B的調(diào)用幀才會消失。如果函數(shù)B內(nèi)部還調(diào)用函數(shù)C,那就還有一個(gè)C的調(diào)用幀,以此類推。所有的調(diào)用幀,就形成了一個(gè)調(diào)用棧。

尾調(diào)用由于是函數(shù)的最后一步操作,所以不需要保留外層函數(shù)的調(diào)用幀,因?yàn)檎{(diào)用位置,內(nèi)部變量等信息都不會再用到了,只要直接用內(nèi)層函數(shù)的調(diào)用幀,取代外層函數(shù)的調(diào)用幀就可以了。

function f() {
 let m = 1;
 let n = 2;
 return g(m + n);
}
f();

// 等同于
function f() {
 return g(3);
}
f();

// 等同于
g(3);

上面代碼中,如果函數(shù)g不是尾調(diào)用,函數(shù)f就需要保存內(nèi)部變量m和n的值、g的調(diào)用位置等信息。但由于調(diào)用g之后,函數(shù)f就結(jié)束了,所以執(zhí)行到最后一步,完全可以刪除f(x)的調(diào)用幀,只保留g(3)的調(diào)用幀。

這就叫做“尾調(diào)用優(yōu)化”(Tail call optimization),即只保留內(nèi)層函數(shù)的調(diào)用幀。如果所有函數(shù)都是尾調(diào)用,那么完全可以做到每次執(zhí)行時(shí),調(diào)用幀只有一項(xiàng),這將大大節(jié)省內(nèi)存。這就是“尾調(diào)用優(yōu)化”的意義。

注意,只有不再用到外層函數(shù)的內(nèi)部變量,內(nèi)層函數(shù)的調(diào)用幀才會取代外層函數(shù)的調(diào)用幀,否則就無法進(jìn)行“尾調(diào)用優(yōu)化”。

function addOne(a){
 var one = 1;
 function inner(b){
  return b + one;
 }
 return inner(a);
}

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具http://tools.jb51.net/code/HtmlJsRun測試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容可查看本站專題:《JavaScript常用函數(shù)技巧匯總》、《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)

希望本文所述對大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 微信小程序?qū)崿F(xiàn)簡單的吸頂效果

    微信小程序?qū)崿F(xiàn)簡單的吸頂效果

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)簡單的吸頂效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 如何在javascript 中使用 xmlHttpRequest 發(fā)送 POST 請求

    如何在javascript 中使用 xmlHttpRequest 發(fā)送 POST

    本文將通過不同的示例解釋如何使用JavaScript代碼在AJAX編程中發(fā)送 XMLHttpRequest post 請求,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-07-07
  • JavaScript代碼實(shí)現(xiàn)春晚劉謙魔術(shù)的模擬程序

    JavaScript代碼實(shí)現(xiàn)春晚劉謙魔術(shù)的模擬程序

    昨晚春晚上劉謙的兩個(gè)魔術(shù)表演都非常精彩,尤其是第二個(gè)魔術(shù),他演繹了經(jīng)典的約瑟夫環(huán)問題!約瑟夫環(huán)是一個(gè)經(jīng)典的數(shù)學(xué)問題,本文給出了完整的 JavaScript 代碼實(shí)現(xiàn),感興趣的同學(xué)可以自己動手實(shí)現(xiàn)一下
    2024-02-02
  • javascript中創(chuàng)建對象的幾種方法總結(jié)

    javascript中創(chuàng)建對象的幾種方法總結(jié)

    以下幾種,是javascript中最常用的創(chuàng)建對象的方式。初學(xué)者看到后,可能會暈掉,甚至?xí)X得擔(dān)心。其實(shí)完全不用擔(dān)心,這些種方式,只需要掌握一兩種,對其他的幾種只需要理解就好了
    2013-11-11
  • JavaScript實(shí)現(xiàn)獲取本機(jī)IP地址

    JavaScript實(shí)現(xiàn)獲取本機(jī)IP地址

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)獲取本機(jī)IP地址方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • JS動態(tài)遍歷json中所有鍵值對的方法(不知道屬性名的情況)

    JS動態(tài)遍歷json中所有鍵值對的方法(不知道屬性名的情況)

    這篇文章主要介紹了JS動態(tài)遍歷json中所有鍵值對的方法,實(shí)例分析了針對不知道屬性名的情況簡單遍歷json鍵值對的操作技巧,需要的朋友可以參考下
    2016-12-12
  • bootstrap Table服務(wù)端處理分頁(后臺是.net)

    bootstrap Table服務(wù)端處理分頁(后臺是.net)

    這篇文章主要為大家詳細(xì)介紹了bootstrap Table服務(wù)端處理分頁,后臺是.net,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • JS擴(kuò)展String.prototype.format字符串拼接的功能

    JS擴(kuò)展String.prototype.format字符串拼接的功能

    這篇文章主要介紹了JS擴(kuò)展String.prototype.format字符串拼接的功能,需要的朋友可以參考下
    2018-03-03
  • 詳解JavaScript原型與原型鏈

    詳解JavaScript原型與原型鏈

    這篇文章主要介紹了JavaScript原型與原型鏈的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下
    2020-11-11
  • JavaScript中的稀疏數(shù)組與密集數(shù)組[譯]

    JavaScript中的稀疏數(shù)組與密集數(shù)組[譯]

    一般來說,JavaScript中的數(shù)組是稀疏的,也就是說,數(shù)組中的元素之間可以有空隙,因?yàn)橐粋€(gè)數(shù)組其實(shí)就是一個(gè)鍵值映射.本文解釋了如何創(chuàng)建稀疏數(shù)組和不稀疏的數(shù)組
    2012-09-09

最新評論