-
閉包
function createComparison(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;
}
}
}
var object1={
name:"dudu"
}
var object2={
name:"lili"
}
var compare=createComparison("name");
var result=compare(object1,object2);
alert(result);//-1
這個是書上給的例子:
特點:-
createComparison
以匿名函數做返回值。 - 匿名函數內部引用了外部函數的變量對象的形參變量
propertyName
。
-
-
閉包定義
閉包是指有權訪問另一個函數作用域中變量的函數。
就像上例,返回的匿名函數訪問了外部函數作用域中的變量propertyName
-
創建閉包的方式
就是在一個函數的內部創建另一個函數。 -
閉包涉及作用域鏈問題
一般來講,當函數執行完畢后,其內的局部活動對象以及相應的作用域鏈就會被銷毀,內存中僅保存全局作用域(全局執行環境的變量對象)。
但是,閉包的情況又有所不同。
外部函數在執行完畢后(成功返回匿名函數后),其執行環境的作用域鏈會被銷毀,但他的活動對象仍然會留在內存中,因為匿名函數的作用域鏈仍然在引用這個活動對象,直到匿名函數被銷毀后,外部函數的活動對象,因為沒有被引用所以才會被銷毀。 - 銷毀匿名函數
如果返回的匿名函數沒有繼續被引用,那么他將被垃圾回收例程清除。
所以由上文代碼中這個匿名函數目前只被compare
引用,只要不讓這個已用類型繼續引用這個匿名函數,那么這個匿名函數就不會有其他途徑被其他變量引用了。
//這時候,我們只需要
compare=null; -
閉包涉及變量值變化問題
作用域鏈對于閉包的這種配置機制,引出了一個值得注意的副作用,即閉包只能取得包含函數中任何變量的最后一個值。
function createFunction(){
var result=new Array();
for(var i=0;i<10;i++){
result[i]=function(){
return i;
};
}
return result;
}
result=createFunction();
alert(result0);//10
閉包在哪里?
閉包在這里!
result[i]=function(){
return i;
};
為每一個數組對象定義一個匿名函數,每個匿名函數都是返回i
的值,而這個i
的值是引用自外部函數的變量i,每當執行這個函數數組內的每一個元素時,都會執行默認函數,且返回變量i的值,但是i的值依舊是10(i沒有被銷毀,因為js沒有塊級作用域)
修改方法:
result[i]=function(num){
return function(){
return num;
}
} (i);
(i)
這樣的寫法,是強制外部函數執行,i為傳遞的參數,每傳遞一次參數其實就是一次函數的執行,就會為該函數創建一個執行環境以及作用域鏈。
這樣的修改方法,使得
function(){ return num;}
這個函數為閉包函數,他引用外部函數的變量num。
【缺點】這個方法雖然解決了閉包引用變量的問題,但是實在是太占用內存了,相當于一個函數內創建了10個閉包函數,那這10個閉包函數的外部函數所占用的資源(本例中的num)也不能釋放。 -
閉包涉及的this對象
一般的,在全局函數中,this等于window,而當函數作為某個對象的方法時,this等于那個對象。
不過閉包的執行環境具有全局性。因為內部函數在搜索this時,只會搜索其活動對象,然而閉包沒有被其他對象調用,所以其this具有全局性
var name="the window";
var obj={
name:"my window",
getName:function(){
return function(){
return this.name;
}
}
}
alert(obj.getName()())//the window
//等價于
alert(this.name)
【解決方法】
1、把外部作用域中的this對象保存在一個閉包能夠訪問到的變量里。就可以讓閉包訪問這個對象了。
var that=this;
return function(){
return that.name;
}
2、把閉包賦給這個對象。
var name="the window";
var obj={
name:"my window",
getName:function(){
return function(){
return this.name;
}
}
}
obj.getName=obj.getName();
alert(obj.getName())//my window -
閉包的優缺點
優點:
JS—閉包
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
推薦閱讀更多精彩內容
- 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高級應用都要依靠閉包實現。 一、變量...