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

javascript中閉包(Closure)詳解

 更新時間:2016年01月06日 08:39:51   投稿:hebedich  
閉包(closure)是Javascript語言的一個難點(diǎn),也是它的特色,很多高級應(yīng)用都要依靠閉包實(shí)現(xiàn)。小編之前一直糊里糊涂的,沒有能夠弄明白JavaScript的閉包到底是什么,有什么用,本文把自己的理解些出來分享一下,希望不理解JavaScript閉包的朋友們看了之后能夠理解閉包!

在javascript中,函數(shù)可看作是一種數(shù)據(jù),可以賦值給變量,可以嵌套在另一個函數(shù)中。

var fun = function(){
  console.log("平底斜");
}

function fun(){
  var n=10;
  function son(){
    n++;
  }
  son();
  console.log(n);
}
fun(); //11
fun(); //11

我們把上面第二段代碼稍微修改下:

var n=10;
function fun(){
  function son(){
    n++;
  }
  son();
  console.log(n);
}
fun(); //11
fun(); //12

看出差別了嗎,如果理解不了代碼執(zhí)行結(jié)果,請看上一篇博文,關(guān)于javascript作用域和作用域鏈的講解。

上面這段代碼中變量n是全局變量,隨時可能被重新賦值,而無需通過fun函數(shù)的調(diào)用。為了讓變量n不受污染,或者說是減少全局變量的污染,我們需要把n放到函數(shù)中作為局部變量。

function fun(){
  var n=10;
  function son(){
    n++;
    console.log(n);
  }
  son();
}
fun(); //11
fun(); //11

如果我們可以在全局中直接調(diào)用son函數(shù),那么便可以達(dá)成想要的效果。son函數(shù)現(xiàn)在是作為局部變量存在,要想在全局中訪問,一般有兩種方法:

一種是賦值給全局變量

var a;
function fun(){
  var n=10;
  a = function son(){
    n++;
    console.log(n);
  }
}
fun(); //son()
a(); //11
a(); //12

另一種是使用return返回值

function fun(){
  var n=10;
  return function son(){
    n++;
    console.log(n);
  }
}
var a=fun();
a(); //11
a(); //12

上面的son()函數(shù)就是閉包,某種意義上所有函數(shù)都可以看作閉包。閉包就是可以訪問外層函數(shù)作用域的變量的函數(shù)。

var a;
function fun(){
  var n=10;
  a = function son(){
    n++;
    console.log(n);
  }
  return a();
}
fun(); //11
a(); //12
a(); //13
fun(); //11
a(); //12
a(); //13

還是上面那段代碼,我們稍微修改下,再看看執(zhí)行結(jié)果,這是因?yàn)槊看螆?zhí)行fun()函數(shù)時都會初始化變量n。

閉包的好處是減少全局變量,避免全局污染,可以將局部變量保存在內(nèi)存中。但這既是優(yōu)點(diǎn)又是缺點(diǎn),一段代碼中如果閉包過多,有可能造成內(nèi)存泄露。由于閉包中局部變量不會被垃圾回收機(jī)制回收,所以需要手動賦值為null(關(guān)于內(nèi)存泄露,后期單獨(dú)開專題)

相關(guān)文章

  • 關(guān)于微信小程序中使用wx.getLocation獲取當(dāng)前詳細(xì)位置并計(jì)算距離

    關(guān)于微信小程序中使用wx.getLocation獲取當(dāng)前詳細(xì)位置并計(jì)算距離

    這篇文章主要介紹了關(guān)于微信小程序中使用wx.getLocation獲取當(dāng)前詳細(xì)位置并計(jì)算距離,wx.getLocation只能夠獲取經(jīng)緯度,不能夠拿到詳細(xì)地址,這里使用騰訊地圖的api,需要的朋友可以參考下
    2023-04-04
  • JavaScript 繪制餅圖的示例

    JavaScript 繪制餅圖的示例

    這篇文章主要介紹了JavaScript 繪制餅圖的示例,幫助大家更好的利用JavaScript繪制圖表,感興趣的朋友可以了解下
    2021-02-02
  • 淺析JavaScript中嚴(yán)格模式的使用

    淺析JavaScript中嚴(yán)格模式的使用

    在ECMAScript5標(biāo)準(zhǔn)中,JavaScript提出了嚴(yán)格模式的概念(Strict Mode),本文就來和大家簡單講講JavaScript中嚴(yán)格模式的具體使用,感興趣的可以了解一下
    2023-05-05
  • 詳解javascript傳統(tǒng)方法實(shí)現(xiàn)異步校驗(yàn)

    詳解javascript傳統(tǒng)方法實(shí)現(xiàn)異步校驗(yàn)

    這篇文章主要為大家介紹了javascript實(shí)現(xiàn)異步校驗(yàn)的方法,感興趣的小伙伴們可以參考一下
    2016-01-01
  • webpack幾種手動實(shí)現(xiàn)HMR的方式

    webpack幾種手動實(shí)現(xiàn)HMR的方式

    眾所周知,在webpack中使用模塊熱替換(HMR),能夠使得應(yīng)用在運(yùn)行時,本文就介紹一下如何實(shí)現(xiàn)HMR,感興趣的可以了解一下
    2021-07-07
  • JS中的進(jìn)程和線程詳解

    JS中的進(jìn)程和線程詳解

    進(jìn)程和線程都是計(jì)算機(jī)中的概念,用于描述程序執(zhí)行時的運(yùn)行單位。在 JavaScript 中,進(jìn)程和線程的概念并不是直接暴露給開發(fā)者的,而是通過瀏覽器或 Node.js 等執(zhí)行環(huán)境來實(shí)現(xiàn)的,文中介紹的非常詳細(xì),感興趣的同學(xué)可以閱讀一下
    2023-04-04
  • 原生JS實(shí)現(xiàn)百葉窗特效

    原生JS實(shí)現(xiàn)百葉窗特效

    這篇文章主要為大家詳細(xì)介紹了原生JS實(shí)現(xiàn)百葉窗特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • JS+CSS實(shí)現(xiàn)網(wǎng)頁加載中的動畫效果

    JS+CSS實(shí)現(xiàn)網(wǎng)頁加載中的動畫效果

    這篇文章主要為大家詳細(xì)介紹了JS+CSS實(shí)現(xiàn)網(wǎng)頁加載中的動畫效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • HBuilderX開發(fā)一個簡單的微信小程序的實(shí)現(xiàn)步驟

    HBuilderX開發(fā)一個簡單的微信小程序的實(shí)現(xiàn)步驟

    本文主要介紹了HBuilderX開發(fā)一個簡單的微信小程序的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • uniapp 封裝組件的方法實(shí)例分析

    uniapp 封裝組件的方法實(shí)例分析

    這篇文章主要介紹了uniapp 封裝組件的方法,結(jié)合實(shí)例形式分析了uniapp父級頁與子頁面組件封裝與傳參交互相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2023-06-06

最新評論