全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

什么是閉包函數(shù)?如何實(shí)現(xiàn)?

更新時(shí)間:2021-10-08 來(lái)源:黑馬程序員 瀏覽量:

IT培訓(xùn)班

什么是閉包函數(shù)?

在JavaSeript中,內(nèi)嵌函數(shù)可以訪問(wèn)定義在外層函數(shù)中的所有變量和函數(shù),并包括其外層函數(shù)能訪問(wèn)的所有變量和函數(shù)。但是在函數(shù)外部則不能訪問(wèn)函數(shù)的內(nèi)部變量和嵌套函數(shù)。

此時(shí)就可以使用“閉包”來(lái)實(shí)現(xiàn)。

所謂“閉包”指的就是有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域內(nèi)變量(局部變量)的函數(shù)。 它最主要的用途是以下兩點(diǎn)。

1.可以在函數(shù)外部讀取函數(shù)內(nèi)部的變量。

2.可以讓變量的值始終保持在內(nèi)存中。

需要注意的是,由于閉包會(huì)使得函數(shù)中的變量一直被保存在內(nèi)存中,內(nèi)存消耗很大,所以濫用閉包可能會(huì)降低程序的處理速度,造成內(nèi)存消耗等問(wèn)題。

閉包函數(shù)的實(shí)現(xiàn)

常見(jiàn)的閉包創(chuàng)建方式就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建另一個(gè)函數(shù),通過(guò)另一個(gè)函數(shù)訪問(wèn)這個(gè)函數(shù)的局部變量。為了讓大家更加清楚閉包函數(shù)的實(shí)現(xiàn),下面我們通過(guò)代碼進(jìn)行演示。

function fn() {
    var times = 0;
    var c = function() {
        return ++times;
    };
    return c;
}
var count = fn();   //保存fn()返回的函數(shù),此時(shí)count就是一個(gè)閉包
//訪問(wèn)測(cè)試
console.log(count());	//輸出結(jié)果: 1
console.log(count());	//輸出結(jié)果: 2
console.log(count());	//輸出結(jié)果: 3
console.log(count());	//輸出結(jié)果: 4
console.log(count());	//輸出結(jié)果: 5

上述第3 ~ 5行代碼,利用閉包函數(shù)實(shí)現(xiàn)了在全局作用域中訪問(wèn)局部變量times,并讓變量的值始終存儲(chǔ)在內(nèi)存中。第8行代碼調(diào)用fn()函數(shù)后,接下來(lái)將匿名函數(shù)的引用返回給count變量,且匿名函數(shù)中使用了局部變量times,因此,局部變量times不會(huì)在fn()函數(shù)執(zhí)行完成后被JavaScript回收,依然保存在內(nèi)存中。

1633682066358_閉包.jpg

運(yùn)行效果



猜你喜歡:

JavaScript for循環(huán)語(yǔ)句操作

JavaScript代碼寫(xiě)在哪里?

javascript開(kāi)發(fā)工具有哪些?

JavaScript有哪三部分組成?

黑馬程序員HTML&JS+前端高手班

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!