淺談JavaScript中的閉包

閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù),個(gè)人認(rèn)為閉包最大的用處就是防止對(duì)全局作用域的污染。 試想如果我們把一些僅僅只用到一兩次的變量都聲明在全局作用域中,最后肯定是容易出錯(cuò)且不可維護(hù)的。而閉包最神奇的地方就是能在一個(gè)函數(shù)外訪問(wèn)函數(shù)中的局部變量,把這些變量用閉包的形式放在函數(shù)中便能避免污染。

一、閉包是什么?

JavaScript高級(jí)程序設(shè)計(jì)》中寫(xiě)道:“閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù)”,如果用下定義的觀點(diǎn)看,這句話就是說(shuō)“閉包是函數(shù)”,我?guī)е鴳岩傻男膽B(tài)又去網(wǎng)上找了找,發(fā)現(xiàn)什么說(shuō)法都有,終究沒(méi)能明白閉包的含義,還是看代碼來(lái)得直接。

function outter()

{

var sky="blue";

function inner()

{console.log(sky);?

?}

return inner;}

var result=outter();

result();//"blue"

這段代碼就包含一個(gè)簡(jiǎn)單的閉包:outter函數(shù)的返回值是一個(gè)函數(shù),即inner。inner在outter內(nèi)部,理所當(dāng)然能訪問(wèn)到局部變量sky,但當(dāng)inner作為outter的返回值賦給outter外的全局變量時(shí),神奇的事情發(fā)生了:在全局作用域中訪問(wèn)到了sky,這就是閉包。

二、閉包的原理?


每個(gè)函數(shù)都有自己的執(zhí)行環(huán)境,當(dāng)一個(gè)函數(shù)被執(zhí)行時(shí),它的執(zhí)行環(huán)境就會(huì)被推入環(huán)境棧,其活動(dòng)對(duì)象(存儲(chǔ)環(huán)境中定義的變量及函數(shù))加入作用域鏈中,一旦函數(shù)執(zhí)行完,棧將其環(huán)境彈出,活動(dòng)對(duì)象被銷(xiāo)毀。·

對(duì)于上面的例子來(lái)說(shuō),outter執(zhí)行完之后將返回inner給了result,outter的執(zhí)行環(huán)境從環(huán)境棧彈出,控制權(quán)交給全局環(huán)境,outter的活動(dòng)對(duì)象理應(yīng)被銷(xiāo)毀。但此時(shí)inner已經(jīng)存儲(chǔ)在全局活動(dòng)對(duì)象中了,同時(shí)inner需要訪問(wèn)sky,所以outter的活動(dòng)對(duì)象沒(méi)有被銷(xiāo)毀,即使result執(zhí)行完畢,outter的活動(dòng)對(duì)象依然存在于作用域鏈中,只有當(dāng)result被銷(xiāo)毀

result= null;

outter的活動(dòng)對(duì)象才會(huì)徹底釋放。

三、閉包有什么用?

說(shuō)了這么多,閉包到底有什么用呢?我個(gè)人認(rèn)為閉包最大的用處就是防止對(duì)全局作用域的污染。 試想如果我們把一些僅僅只用到一兩次的變量都聲明在全局作用域中,最后肯定是容易出錯(cuò)且不可維護(hù)的。而閉包最神奇的地方就是能在一個(gè)函數(shù)外訪問(wèn)函數(shù)中的局部變量,把這些變量用閉包的形式放在函數(shù)中便能避免污染。


四、Caveat


閉包將函數(shù)的活動(dòng)對(duì)象維持在內(nèi)存中,過(guò)度使用閉包會(huì)導(dǎo)致內(nèi)存占用過(guò)多;

閉包只能取得外部函數(shù)中任何變量的最后一個(gè)值,在使用循環(huán)且返回的函數(shù)中帶有循環(huán)變量時(shí)會(huì)得到錯(cuò)誤結(jié)果;

當(dāng)返回的函數(shù)為匿名函數(shù)時(shí),注意匿名函數(shù)中的this指的是window對(duì)象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在學(xué)習(xí)Javascript腳本語(yǔ)言的路上,閉包一直困惑著每一個(gè)剛接觸這門(mén)語(yǔ)言的程序猿。 ——存在的即是合理的。首...
    麻不燒閱讀 258評(píng)論 0 5
  • 廢話 閉包,這個(gè)詞甚至讓很多人看到都覺(jué)得頭疼,有的人說(shuō)這東西非常好用,有人說(shuō)不懂是啥東西... 引用一段JavaS...
    庸者的救贖閱讀 452評(píng)論 0 3
  • 作用域和閉包是 JavaScript 最重要的概念之一,想要進(jìn)一步學(xué)習(xí) JavaScript,就必須理解 Java...
    劼哥stone閱讀 1,246評(píng)論 1 13
  • ● 閉包基礎(chǔ) ● 閉包作用 ● 閉包經(jīng)典例子 ● 閉包應(yīng)用 ● 閉包缺點(diǎn) ● 參考資料 1、閉包基礎(chǔ) 作用域和作...
    lzyuan閱讀 1,041評(píng)論 0 0
  • 奶奶去世已有四年,沒(méi)有奶奶的日子里,太陽(yáng)照常升起,地球一樣轉(zhuǎn)動(dòng),四季依舊變換,生活,還是以前的模樣,大多數(shù)人不會(huì)...
    李黎理閱讀 1,220評(píng)論 3 10

友情鏈接更多精彩內(nèi)容