好程序員 技術(shù)分享 淺談 JavaScript 中的閉包 , js 閉包 是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù) , 個人認為 js 閉包大的用處就是防止對全局作用域的污染。 試想如果我們把一些僅僅只用到一兩次的變量都聲明在全局作用域中,最后肯定是容易出錯且不可維護的。而閉包最神奇的地方就是能在一個函數(shù)外訪問函數(shù)中的局部變量,把這些變量用閉包的形式放在函數(shù)中便能避免污染。
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比南京網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式南京網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋南京地區(qū)。費用合理售后完善,十余年實體公司更值得信賴。《 JavaScript 高級程序設(shè)計》中寫道: “閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù)”,如果用下定義的觀點看,這句話就是說“閉包是函數(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"
這段代碼就包含一個簡單的閉包: outter函數(shù)的返回值是一個函數(shù),即inner。inner在outter內(nèi)部,理所當然能訪問到局部變量sky,但當inner作為outter的返回值賦給outter外的全局變量時,神奇的事情發(fā)生了:在全局作用域中訪問到了sky,這就是閉包。
每個函數(shù)都有自己的執(zhí)行環(huán)境,當一個函數(shù)被執(zhí)行時,它的執(zhí)行環(huán)境就會被推入環(huán)境棧,其活動對象 (存儲環(huán)境中定義的變量及函數(shù))加入作用域鏈中,一旦函數(shù)執(zhí)行完,棧將其環(huán)境彈出,活動對象被銷毀。
對于上面的例子來說, outter執(zhí)行完之后將返回inner給了result,outter的執(zhí)行環(huán)境從環(huán)境棧彈出,控制權(quán)交給全局環(huán)境,outter的活動對象理應(yīng)被銷毀。但此時inner已經(jīng)存儲在全局活動對象中了,同時inner需要訪問sky,所以outter的活動對象沒有被銷毀,即使result執(zhí)行完畢,outter的活動對象依然存在于作用域鏈中,只有當result被銷毀
//code from http://caibaojian.com/javascript-closure.htmlresult = null ;
outter的活動對象才會徹底釋放。
說了這么多,閉包到底有什么用呢?我個人認為閉包大的用處就是防止對全局作用域的污染。 試想如果我們把一些僅僅只用到一兩次的變量都聲明在全局作用域中,最后肯定是容易出錯且不可維護的。而閉包最神奇的地方就是能在一個函數(shù)外訪問函數(shù)中的局部變量,把這些變量用閉包的形式放在函數(shù)中便能避免污染。
· 閉包將函數(shù)的活動對象維持在內(nèi)存中,過度使用閉包會導(dǎo)致內(nèi)存占用過多;
· 閉包只能取得外部函數(shù)中任何變量的最后一個值,在使用循環(huán)且返回的函數(shù)中帶有循環(huán)變量時會得到錯誤結(jié)果;
· 當返回的函數(shù)為匿名函數(shù)時,注意匿名函數(shù)中的 this指的是window對象。
網(wǎng)頁標題:好程序員技術(shù)分享淺談JavaScript中的閉包-創(chuàng)新互聯(lián)
本文URL:http://jinyejixie.com/article24/coicje.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計公司、品牌網(wǎng)站制作、網(wǎng)站建設(shè)、用戶體驗
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容