更新時(shí)間:2021-10-08 來(lái)源:黑馬程序員 瀏覽量:
什么是閉包函數(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)存中。
運(yùn)行效果
猜你喜歡: