閉包是什么?用處如何?

大家好,我是IT修真院成都分院第8期的學員,一枚正直純潔善良的WEB前端程序員。今天給大家分享一下閉包是什么,用處如何。


1、閉包是什么?

閉包(closure)是JS中一個較難理解的一個概念,JS函數(shù)的執(zhí)行依賴于變量作用域, 函數(shù)對象的內(nèi)部狀態(tài)包含函數(shù)自身的邏輯,還必須引用當前的作用域鏈。 函數(shù)對象可以相互關(guān)聯(lián)起來,函數(shù)體內(nèi)部的變量可以保存在函數(shù)作用域內(nèi), 具有這種特性的函數(shù)稱為閉包。 各種專業(yè)文獻上的"閉包"(closure)定義非常抽象,很難看懂。 我的理解是,閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。 由于在Javascript語言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量, 因此可以把閉包簡單理解成"定義在一個函數(shù)內(nèi)部的函數(shù)"。 所以,在本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁。---阮一峰

2、閉包的作用?

(1)可以讀取函數(shù)內(nèi)部的變量


/*使用閉包讀取函數(shù)內(nèi)部的變量*/

function f1(){

n = 999;

function f2(){

alert(n);

}

return f2;

}

var result = f1();

result(); //999

(2)讓這些變量的值始終保存在內(nèi)存中

/*使用閉包讓函數(shù)內(nèi)部的變量儲存在內(nèi)存中*/

function f1(){

n = 999;

nAdd = function(){

n+=1;

};

function f2(){

alert(n);

}

return f2;

}

var result = f1();

result();//999

nAdd();

result();//1000

3、常見的問題?

window.onload = function(){

var el = document.getElementById("id");

el.onclick = function(){

alert(el.id);

}

}

這段代碼會造成內(nèi)存泄漏,為什么?

執(zhí)行這段代碼的時候,將匿名函數(shù)對象賦值給el的onclick屬性;然后匿名函數(shù)內(nèi)部又引用了el對象,存在循環(huán)引用,所以不能被垃圾回收機制回收;

解決辦法:

window.onload = function(){

var el = document.getElementById("id");

var id = el.id; //解除循環(huán)引用

el.onclick = function(){

alert(id);

}

el = null; // 將閉包引用的外部函數(shù)中活動對象清除

}

4、討論

var name = "The Window";

var object = {

name : "My Object",

getNameFunc : function(){

return function(){

return this.name;

};

}

};

alert(object.getNameFunc()());//the window

按照閉包的原理,輸出的不應(yīng)該是 my object嗎?

答: 匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其 this 對象通常指向 window。

第二個例子中的的nAdd這個函數(shù)在函數(shù)f1內(nèi)部,為什么說他是一個閉包呢?

答:這是一個函數(shù)聲明式,但是沒有var,所以這是一個全局變量,等于從外部訪問內(nèi)部變量,所以這是一個閉包。

使用閉包有什么好處呢?

答:可以從外部調(diào)用函數(shù)內(nèi)部變量,避免污染全局變量。

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

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