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

理解javascript閉包

 更新時(shí)間:2015年12月15日 11:41:54   投稿:lijiao  
這篇文章主要幫助大家理解javascript閉包概念優(yōu)缺點(diǎn)及應(yīng)用,幫助大家全面的學(xué)習(xí)javascript閉包,需要的朋友可以參考下

什么是javascript閉包?
javascript允許使用內(nèi)部函數(shù),內(nèi)部函數(shù)可以訪問(wèn)它們所在的外部函數(shù)中聲明的所有局部變量、參數(shù)和聲明的其他內(nèi)部函數(shù)。當(dāng)其中一個(gè)這樣的內(nèi)部函數(shù)在包含它們的外部函數(shù)之外被調(diào)用時(shí),就會(huì)形成閉包。
簡(jiǎn)單的javascript閉包例子:

<script>
  function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000
</script>

在這段代碼中,result實(shí)際上就是閉包f2函數(shù)。它一共運(yùn)行了兩次,第一次的值是999,第二次的值是1000。這證明了,函數(shù)f1中的局部變量n一直保存在內(nèi)存中,并沒(méi)有在f1調(diào)用后被自動(dòng)清除。
為什么會(huì)這樣呢?原因就在于f1是f2的父函數(shù),而f2被賦給了一個(gè)全局變量,這導(dǎo)致f2始終在內(nèi)存中,而f2的存在依賴(lài)于f1,因此f1也始終在內(nèi)存中,不會(huì)在調(diào)用結(jié)束后,被垃圾回收機(jī)制(garbage collection)回收。
這段代碼中另一個(gè)值得注意的地方,就是"nAdd=function(){n+=1}"這一行,首先在nAdd前面沒(méi)有使用var關(guān)鍵字,因此nAdd是一個(gè)全局變量,而不是局部變量。其次,nAdd的值是一個(gè)匿名函數(shù)(anonymous function),而這個(gè)匿名函數(shù)本身也是一個(gè)閉包,所以nAdd相當(dāng)于是一個(gè)setter,可以在函數(shù)外部對(duì)函數(shù)內(nèi)部的局部變量進(jìn)行操作。
 閉包的應(yīng)用:

var singleton = function () {
  var privateVariable;
  function privateFunction(x) {
    ...privateVariable...
  }
 
  return {
    firstMethod: function (a, b) {
      ...privateVariable...
    },
    secondMethod: function (c) {
      ...privateFunction()...
    }
  };
}();

 這個(gè)單件通過(guò)閉包來(lái)實(shí)現(xiàn)。通過(guò)閉包完成了私有的成員和方法的封裝。匿名主函數(shù)返回一個(gè)對(duì)象。對(duì)象包含了兩個(gè)方法,方法1可以方法私有變量,方法2訪問(wèn)內(nèi)部私有函數(shù)。需要注意的地方是匿名主函數(shù)結(jié)束的地方的'()',如果沒(méi)有這個(gè)'()'就不能產(chǎn)生單件。因?yàn)槟涿瘮?shù)只能返回了唯一的對(duì)象,而且不能被其他地方調(diào)用。這個(gè)就是利用閉包產(chǎn)生單件的方法。

閉包的優(yōu)勢(shì):
(1)不增加額外的全局變量,
(2)執(zhí)行過(guò)程中所有變量都是在匿名函數(shù)內(nèi)部。
閉包的缺點(diǎn):
(1)由于閉包會(huì)使得函數(shù)中的變量都被保存在內(nèi)存中,內(nèi)存消耗很大,所以不能濫用閉包,否則會(huì)造成網(wǎng)頁(yè)的性能問(wèn)題,在IE中可能導(dǎo)致內(nèi)存泄露。解決方法是,在退出函數(shù)之前,將不使用的局部變量全部刪除。
(2)閉包會(huì)在父函數(shù)外部,改變父函數(shù)內(nèi)部變量的值。所以,如果你把父函數(shù)當(dāng)作對(duì)象(object)使用,把閉包當(dāng)作它的公用方法(Public Method),把內(nèi)部變量當(dāng)作它的私有屬性(private value),這時(shí)一定要小心,不要隨便改變父函數(shù)內(nèi)部變量的值。

本文就為大家介紹這里,如果大家對(duì)javascript閉包還是不夠了解,請(qǐng)閱讀相關(guān)文章進(jìn)行補(bǔ)充學(xué)習(xí),謝謝大家的閱讀。

相關(guān)文章

  • 基于JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器

    基于JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 基于JavaScript實(shí)現(xiàn)無(wú)縫滾動(dòng)效果

    基于JavaScript實(shí)現(xiàn)無(wú)縫滾動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了基于JavaScript實(shí)現(xiàn)無(wú)縫滾動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 淺談Cookie的生命周期問(wèn)題

    淺談Cookie的生命周期問(wèn)題

    下面小編就為大家?guī)?lái)一篇淺談Cookie的生命周期問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • JavaScript程序設(shè)計(jì)之JS調(diào)試

    JavaScript程序設(shè)計(jì)之JS調(diào)試

    這篇文章主要介紹了JavaScript程序設(shè)計(jì)中的重要環(huán)節(jié):JS調(diào)試,本文通過(guò)一個(gè)加法器,介紹JS如何調(diào)試,感興趣的小伙伴們可以參考一下
    2015-12-12
  • js取消單選按鈕選中并判斷對(duì)象是否為空

    js取消單選按鈕選中并判斷對(duì)象是否為空

    取消單選按鈕選中并判斷對(duì)象是否為空,在項(xiàng)目中也是比較常見(jiàn)的,下面有個(gè)不錯(cuò)的示例,感興趣的朋友可以參考下
    2013-11-11
  • JS實(shí)現(xiàn)圖片瀑布流效果

    JS實(shí)現(xiàn)圖片瀑布流效果

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)圖片瀑布流,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JavaScript中判斷為整數(shù)的多種方式及保留兩位小數(shù)的方法

    JavaScript中判斷為整數(shù)的多種方式及保留兩位小數(shù)的方法

    這篇文章主要介紹了JavaScript中判斷為整數(shù)的多種方式,以及保留兩位小數(shù)的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JavaScript多功能甘特圖組件jsGantt詳解

    JavaScript多功能甘特圖組件jsGantt詳解

    jsGantt是一個(gè)可定制的、靈活的、多語(yǔ)言的甘特圖組件,由原生 JavaScript構(gòu)建,它使用客戶端渲染以獲得快速的性能和動(dòng)態(tài)的交互性,非常適用于任何需要交互式時(shí)間線或時(shí)間表顯示的項(xiàng)目,本文就給大家介紹一下JavaScript多功能甘特圖組件jsGantt
    2023-07-07
  • 談?wù)凧avaScript中function多重理解

    談?wù)凧avaScript中function多重理解

    Function是javascript里最常用的一個(gè)概念,javascript里的function是最容易入手的一個(gè)功能,但它也是javascript最難理解最難掌握的一個(gè)概念,接下來(lái)通過(guò)本篇文章給大家介紹javascript中的function多重理解,小伙伴們一起來(lái)學(xué)習(xí)吧
    2015-08-08
  • 百度地圖去掉marker覆蓋物或者去掉maker的label文字方法

    百度地圖去掉marker覆蓋物或者去掉maker的label文字方法

    下面小編就為大家分享一篇百度地圖去掉marker覆蓋物或者去掉maker的label文字方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論