各種專業文獻上的"閉包"(closure)定義非常抽象,很難看懂。我的理解是,閉包就是能夠讀取其他函數內部變量的函數。
由於在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。
所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋樑。
閉包的用途
閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函數內部的變量,另一個就是讓這些變量的值始終保持在內存中。
代碼片段一。
var name = "The Window";
var object = {
name : "My Object",getNameFunc : function(){
return function(){
return this.name;
};}
};
alert(object.getNameFunc()());
代碼片段二。
var name = "The Window";
var object = {
name : "My Object",getNameFunc : function(){
var that = this;
return function(){
return that.name;
};}
};
alert(object.getNameFunc()());
第一個 打印結果爲 The window
第二個 打印結果爲 My Object
第一個 this爲全局對象,所以alert處理的name爲The window
第二個 that 爲object對象,所以alert 處理的name爲My object
第二個好理解,因爲在調用前用that 保存了object 自己的this,所以that 就成爲是有變量,在閉包內可以調用。
第一個有點暈,因爲第一個的this指向自己,然後被window 給調用this 就成了window對象,它的name就是全局的name
return function() {
return this.name;
}
這裏的this代表調用方法時所在的的作用域:全局作用域window。
return function() {
return that.name;
}
object.getNameFunc()()此處實現了從外部調用局部變量的方法,that會順着作用域鏈向上級作用域查找,所以獲得是getnameFunc的定義的變量var that = this。
每個函數在被調用時,其活動對象都會自動取得兩個特殊變量:this和arguments。內部函數在搜索這個變量時,只會搜索到其活動對象爲止,因此永遠不可能直接訪問外部函數中的這兩個變量(這一點通過前面的圖可以看得更清楚)。意思就是說找到匿名函數中的this和arguments就不會再往下找了(這裏的往下指的是外層的包含函數,和最外層的window全局環境),而匿名函數的this對象通常指向window,所以輸出的是全局的那個字符串。不過,把外部作用域中的this對象保存在一個閉包能夠訪問到的變量裏,就可以讓閉包訪問該對象了
關於this:http://www.quirksmode.org/js/this.html