溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2020-08-10 22:28:09 來源:ITPUB博客 閱讀:114 作者:好程序員IT 欄目:web開發(fā)

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

一、閉包是什么?

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

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)然能訪問到局部變量sky,但當(dāng)inner作為outter的返回值賦給outter外的全局變量時(shí),神奇的事情發(fā)生了:在全局作用域中訪問到了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ì)于上面的例子來說, 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需要訪問sky,所以outter的活動(dòng)對(duì)象沒有被銷毀,即使result執(zhí)行完畢,outter的活動(dòng)對(duì)象依然存在于作用域鏈中,只有當(dāng)result被銷毀

//code from http://caibaojian.com/javascript-closure.htmlresult  = null

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

三、閉包有什么用 ?

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

四、 Caveat

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

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

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


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI