最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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è)重要概念,本身非常簡(jiǎn)單,一句話就能說(shuō)清楚,就是指某個(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)用會(huì)在內(nèi)存形成一個(gè)“調(diào)用記錄”,又稱調(diào)用幀,保存調(diào)用位置和內(nèi)部變量等信息。如果在函數(shù)A的內(nèi)部調(diào)用了函數(shù)B,那么在A的調(diào)用幀上方還會(huì)形成一個(gè)B的調(diào)用幀。等到B運(yùn)行結(jié)束,將結(jié)果返回A,B的調(diào)用幀才會(huì)消失。如果函數(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)部變量等信息都不會(huì)再用到了,只要直接用內(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)用幀才會(huì)取代外層函數(shù)的調(diào)用幀,否則就無(wú)法進(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測(cè)試上述代碼運(yùn)行效果。

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

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

相關(guān)文章

  • 微信小程序 自定義消息提示框

    微信小程序 自定義消息提示框

    這篇文章主要介紹了微信小程序 自定義消息提示框的相關(guān)資料,wx.showToast(OBJECT)接口調(diào)用,實(shí)現(xiàn)改功能,需要的朋友可以參考下
    2017-08-08
  • 那些項(xiàng)目中常見(jiàn)的TypeScript錯(cuò)誤總結(jié)

    那些項(xiàng)目中常見(jiàn)的TypeScript錯(cuò)誤總結(jié)

    這篇文章主要給大家總結(jié)介紹了一些項(xiàng)目中常見(jiàn)的TypeScript錯(cuò)誤的相關(guān)資料,如果你想查看所有的錯(cuò)誤信息和錯(cuò)誤碼,可以瀏覽TypeScript的源代碼倉(cāng)庫(kù),當(dāng)然隨著?ts?版本的更新,官網(wǎng)也會(huì)逐漸增加更多新的類型錯(cuò)誤,需要的朋友可以參考下
    2022-03-03
  • js中的數(shù)組Array定義與sort方法使用示例

    js中的數(shù)組Array定義與sort方法使用示例

    Array定義與sort方法在使用過(guò)程中還是比較常見(jiàn)的,下面為大家介紹下Array的定義及sort方法使用示例
    2013-08-08
  • javasript實(shí)現(xiàn)密碼的隱藏與顯示

    javasript實(shí)現(xiàn)密碼的隱藏與顯示

    用戶輸入密碼時(shí)都是顯示的星號(hào)了,那么我們希望查看明文要怎么查看呢,下面我們只要使用一段簡(jiǎn)單的js就可以實(shí)現(xiàn)查看密碼框的明文了,有需要的小伙伴可以來(lái)參考下。
    2015-05-05
  • javascript中的Base64、UTF8編碼與解碼詳解

    javascript中的Base64、UTF8編碼與解碼詳解

    本文給大家介紹的是javascript中的Base64、UTF8編碼與解碼的函數(shù)源碼分享以及使用范例,十分實(shí)用,推薦給小伙伴們,希望大家能夠喜歡。
    2015-03-03
  • layui使用templet格式化表格數(shù)據(jù)的方法

    layui使用templet格式化表格數(shù)據(jù)的方法

    今天小編就為大家分享一篇layui使用templet格式化表格數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • JS全角與半角轉(zhuǎn)化實(shí)例(分享)

    JS全角與半角轉(zhuǎn)化實(shí)例(分享)

    下面小編就為大家?guī)?lái)一篇JS全角與半角轉(zhuǎn)化實(shí)例(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • ES6生成器用法實(shí)例分析

    ES6生成器用法實(shí)例分析

    這篇文章主要介紹了ES6生成器用法,結(jié)合實(shí)例形式分析了ECMAScript6中生成器的概念、語(yǔ)法、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-04-04
  • uni-app打開(kāi)外部鏈接方式總結(jié)(h5和app)

    uni-app打開(kāi)外部鏈接方式總結(jié)(h5和app)

    uni-app在app和h5中跳轉(zhuǎn)至外部鏈接的方式有所不同,需要進(jìn)行條件編譯,下面這篇文章主要給大家介紹了關(guān)于uni-app打開(kāi)外部鏈接方式(h5和app)的相關(guān)資料,文章通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • JS中節(jié)流和防抖函數(shù)的實(shí)現(xiàn)及區(qū)別示例

    JS中節(jié)流和防抖函數(shù)的實(shí)現(xiàn)及區(qū)別示例

    這篇文章主要為大家介紹了JS中節(jié)流和防抖函數(shù)的實(shí)現(xiàn)及使用區(qū)別示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06

最新評(píng)論

汕头市| 黄骅市| 日照市| 株洲县| 遵义市| 固安县| 甘南县| 交城县| SHOW| 沅陵县| 正宁县| 孝昌县| 油尖旺区| 资溪县| 灵宝市| 永定县| 枞阳县| 沂水县| 大庆市| 大厂| 大埔区| 昭平县| 泰顺县| 辽阳县| 宜良县| 宜阳县| 锡林浩特市| 庆城县| 河源市| 鄂伦春自治旗| 海兴县| 古丈县| 抚顺市| 清镇市| 阿城市| 临泽县| 遂昌县| 永兴县| 元江| 白水县| 涡阳县|