你有真正了解閉包嗎?

JavaScript語言精粹對閉包是這樣描述的:

首先列舉了一個例子:

//創建一個名為 quo 的構造函數
//它構造出帶有 get_status 方法和 status 私有屬性的一個對象
var quo = function (status) {
return {
get_status:function () {
return status;
}
};
};
//構造一個 quo 實例
var myQuo = quo("amazed");
document.writeln(myQuo.get_status());

 這個 quo 函數被設計成無須再前面加上new 來使用, 所以名字也沒有首字母大寫。當我們調用 quo 時,它返回包含get_status 方法的一個新對象。該對象的一個引用保存在myQuo中。即使quo 已經返回了,但是get_status 方法仍然享有返回 quo 對象的 status 屬性的特權。get_status 方法並不是訪問該參數的一個副本,它訪問的就是該參數本身。這是可能的,因為該函數可以訪問它被創建時所處的上下文環境。這就是閉包。

你有真正瞭解閉包嗎?

1.閉包可以簡單的理解為函數嵌套。2.每一個函數都可以理解為閉包。3.閉包不是一句話可以簡單概括的。

閉包是指有權訪問另一個函數作用域中的變量的函數。創建閉包的常見方式,就是在一個函數內部創建另一個函數,仍以前面的 createComparisonFunction() 函數為例,注意加粗的代碼。

function createComparisonFunction(propertyName) {
return function (object1, object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName];

if(value1 < value2){
return -1;
} else if(value1 > value2){
return 1;
} else {
return 0;
}
};
}

在這個例子中,突出的那兩行代碼是內部函數(一個匿名函數)中的代碼,這兩行代碼訪問了外部函數中的變量 propertyName 。即使這個內部函數被返回了,而且是在其他地方被調用了,,但它仍然可以訪問變量 propertyName 。之所以還能夠訪問這個變量,是因為內部函數的作用域鏈中包含createComparisonFunction() 的作用域。要徹底搞清楚其中的細節,必須從理解函數被調用的時候都會發生什麼入手。

對前端的技術,架構技術感興趣的同學關注我的頭條號,並在後臺私信發送關鍵字:“前端”即可獲取免費的架構師學習資料

知識體系已整理好,歡迎免費領取。還有面試視頻分享可以免費獲取。關注我,可以獲得沒有的經驗哦!


分享到:


相關文章: