好程序員技術(shù)分享淺談JavaScript中的閉包

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

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)推出沈丘免費(fèi)做網(wǎng)站回饋大家。

一、閉包是什么?

《 JavaScript 高級(jí)程序設(shè)計(jì)》中寫道: “閉包是指有權(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ì)象被銷毀。

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

//code from http://caibaojian.com/javascript-closure.htmlresult  = 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ì)象。

網(wǎng)站名稱:好程序員技術(shù)分享淺談JavaScript中的閉包
分享路徑:http://bm7419.com/article18/jcecdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、商城網(wǎng)站、網(wǎng)站設(shè)計(jì)電子商務(wù)、企業(yè)建站品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)