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

一文了解JavaScript閉包函數(shù)

 更新時間:2021年11月09日 15:25:08   作者:星河夢~  
閉包是js的一個難點也是它的一個特色,是我們必須掌握的js高級特性,下面這篇文章主要給大家介紹了關(guān)于JavaScript閉包函數(shù)的相關(guān)資料,需要的朋友可以參考下

變量作用域

要理解JavaScript閉包,就要先理解JavaScript的變量作用域。

變量的作用域有兩種:全局的和局部的(全局變量和局部變量)

JavaScript中,在函數(shù)內(nèi)部可以直接讀取到全局變量。

var n=10
function fn(){
	alert(n)
}
fn()      //10

而在函數(shù)外部無法讀取到函數(shù)內(nèi)部的變量。

function fn(){
	var n=10;
}
fn()
alert(n)   //n is not defined    函數(shù)外部無法讀取到函數(shù)內(nèi)部的n

注意:函數(shù)內(nèi)部使用var聲明變量的時候,這個變量是局部變量,如果不使用var,那么這個變量就是一個全局變量。

例如:

function fn(){
	n=10;
}
fn()
alert(n)   //10

另外,函數(shù)的參數(shù)也是局部性的,只在函數(shù)內(nèi)部起作用。

在正常情況下,我們是無法得到函數(shù)內(nèi)部的局部變量的,只有變通方法才可以——在函數(shù)內(nèi)部再聲明一個函數(shù)。

function f1(){
	var n=10;
	function f2(){
		alert(n)
	}
}

f2函數(shù)可以得到f1函數(shù)內(nèi)的所有局部變量,但是f1函數(shù)卻無法得到f2函數(shù)內(nèi)部的局部變量——JavaScript語言特有的“鏈?zhǔn)阶饔糜颉苯Y(jié)構(gòu)。(即子對象會一級一級地向上尋找所有父對象的變量),所以,父對象的所有變量,對于子對象都是可見的。

f2函數(shù)可以獲取到父級函數(shù)f1的局部變量,那么如果把f2()函數(shù)返回,在函數(shù)f1外部就可以訪問到f1()函數(shù)內(nèi)部的變量了。

例如:

function f1(){
	var n=10;
	function f2(){
		alert(n)
	}
	return f2()
}
f1()           //頁面彈出10

例子中的f2()函數(shù)就是一個閉包函數(shù)。

閉包的概念

由于作用域原因,我們無法在函數(shù)外訪問函數(shù)里面定義的變量,但有事我們又有這個需求,因此就出現(xiàn)了閉包的概念。

閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)。

在上面的例子中,內(nèi)部函數(shù)f2就是一個閉包函數(shù)。

在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的橋梁。

閉包是一種保護私有變量的機制,在函數(shù)執(zhí)行時形成私有的作用域,保護里面的私有變量不受外界干擾。

閉包的用途

(1)可以讀取父級作用域函數(shù)內(nèi)部的變量;

(2)讓變量的值始終保存在內(nèi)存中(讓局部變量變成全局變量),不被垃圾回收機制清除。

閉包的缺點

由于閉包會使函數(shù)中的變量都保存到內(nèi)存中,垃圾回收機制不清理,內(nèi)存消耗很大,所以不能濫用閉包,否則可能導(dǎo)致內(nèi)存泄漏。

補充:

什么是內(nèi)存泄漏?

程序的運行都是需要內(nèi)存的。只要對內(nèi)存提出要求,操作系統(tǒng)必須供給內(nèi)存。
當(dāng)應(yīng)用程序中的一些代碼變量不再需要用到內(nèi)存時,但是沒有被操作系統(tǒng)或者可用內(nèi)存池回收,就說明它發(fā)生了內(nèi)存泄漏。

即,當(dāng)已經(jīng)不再需要某塊內(nèi)存時,這塊內(nèi)存還存在著——內(nèi)存泄漏

解決閉包引起的內(nèi)存泄漏的問題:

在退出函數(shù)之前,將不使用的局部變量全部刪除。

例如:將當(dāng)前變量的值設(shè)置為‘null',當(dāng)垃圾回收機制啟動時,會自動對這些值為‘null'的變量回收。

最后總結(jié)一下閉包的好處與壞處

好處

①保護函數(shù)內(nèi)的變量安全 ,實現(xiàn)封裝,防止變量流入其他環(huán)境發(fā)生命名沖突

②在內(nèi)存中維持一個變量,可以做緩存(但使用多了同時也是一項缺點,消耗內(nèi)存)

③匿名自執(zhí)行函數(shù)可以減少內(nèi)存消耗

壞處

①其中一點上面已經(jīng)有體現(xiàn)了,就是被引用的私有變量不能被銷毀,增大了內(nèi)存消耗,造成內(nèi)存泄漏,解決方法是可以在使用完變量后手動為它賦值為null;

②其次由于閉包涉及跨域訪問,所以會導(dǎo)致性能損失,我們可以通過把跨作用域變量存儲在局部變量中,然后直接訪問局部變量,來減輕對執(zhí)行速度的影響

總結(jié)

到此這篇關(guān)于JavaScript閉包函數(shù)的文章就介紹到這了,更多相關(guān)JavaScript閉包函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Js 訂制自己的AlertBox(信息提示框)

    Js 訂制自己的AlertBox(信息提示框)

    這是一篇譯文,實例分析制作自定義的信息提示框的實現(xiàn)代碼
    2009-01-01
  • JavaScript實現(xiàn)輪播圖片完整代碼

    JavaScript實現(xiàn)輪播圖片完整代碼

    這篇文章主要為大家介紹了JavaScript實現(xiàn)輪播圖片的完整代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • js移動端事件基礎(chǔ)及常用事件庫詳解

    js移動端事件基礎(chǔ)及常用事件庫詳解

    這篇文章主要為大家詳細(xì)介紹了js移動端事件基礎(chǔ)及常用事件庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • JavaScript實現(xiàn)鼠標(biāo)移入隨機變換顏色

    JavaScript實現(xiàn)鼠標(biāo)移入隨機變換顏色

    這篇文章主要給大家介紹了關(guān)于JavaScript實現(xiàn)鼠標(biāo)移入隨機變換顏色的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • js中call與apply的用法小結(jié)

    js中call與apply的用法小結(jié)

    本篇文章主要是對js中call與apply的用法進行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • IE中鼠標(biāo)經(jīng)過option觸發(fā)mouseout的解決方法

    IE中鼠標(biāo)經(jīng)過option觸發(fā)mouseout的解決方法

    這篇文章主要介紹了IE中鼠標(biāo)經(jīng)過option觸發(fā)mouseout的解決方法,分析了IE中鼠標(biāo)移到option時window.event.toElement返回值為null的原因及解決方法,需要的朋友可以參考下
    2015-01-01
  • JS 參數(shù)傳遞的實際應(yīng)用代碼分析

    JS 參數(shù)傳遞的實際應(yīng)用代碼分析

    在項目中,有一個Ajax加載的區(qū)域,是一個Div標(biāo)簽,id為msg_box,這個控制鏈接包含在一個左側(cè)的導(dǎo)航中,當(dāng)從其他頁面鏈接到這個頁面時,該JS代碼就失效了。
    2009-09-09
  • 原生js實現(xiàn)淘寶首頁點擊按鈕緩慢回到頂部效果

    原生js實現(xiàn)淘寶首頁點擊按鈕緩慢回到頂部效果

    本例將實現(xiàn)這樣的一個效果:下拉到一定距離后按鈕才顯示出來,鼠標(biāo)放到按鈕上時,按鈕背景會變成灰色,并且圖標(biāo)變成了文字。點擊按鈕緩慢回到頂部
    2014-04-04
  • 詳解webpack4升級指南以及從webpack3.x遷移

    詳解webpack4升級指南以及從webpack3.x遷移

    本篇文章主要介紹了詳解webpack4升級指南以及從webpack3.x遷移,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 淺談js多維數(shù)組和hash數(shù)組定義和使用

    淺談js多維數(shù)組和hash數(shù)組定義和使用

    下面小編就為大家?guī)硪黄獪\談js多維數(shù)組和hash數(shù)組定義和使用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07

最新評論

长顺县| 东丰县| 昌乐县| 京山县| 耒阳市| 敦煌市| 焦作市| 武川县| 尼玛县| 中方县| 开平市| 鄂尔多斯市| 布尔津县| 东港市| 安塞县| 彰化县| 黎平县| 徐汇区| 休宁县| 三亚市| 漳州市| 互助| 德庆县| 江阴市| 夏津县| 城市| 云安县| 康平县| 明光市| 天台县| 砀山县| 浏阳市| 闽清县| 滨海县| 达尔| 永福县| 井冈山市| 卫辉市| 永春县| 浦北县| 乌恰县|