創建閉包的常見方法是在函數中創建函數。示例:
functioncreateFunction(名稱){
回歸?函數(obj1,?obj2){
var?value1?=?obj 1[姓名];
var?value2?=?obj 2[姓名];
回歸?value1?+?",?"?+value 2;
}
}為了徹底理解閉包,了解創建作用域的細節以及作用域的作用非常重要。當壹個函數被調用時,壹個執行環境和相應的作用域鏈被創建。然後,用自變量和其他參數的值初始化函數的活動對象。
首先,結束
1和createFunction()創建時,其(比較)的作用域包含createFunction()函數的活動對象和全局對象。
//創建壹個函數
var?比較?=?create function(" name ");
console . log(type of compare);//函數2。匿名函數執行時,創建自己的活動對象和可以訪問createFunction()的執行環境。
//調用函數
var?結果?=比較({name:?" jjaiy"},?{ name:" ascy " });//jjayy,?ascy3和createFunction()函數執行後,其執行環境的作用域不會被破壞。原因是它的活動對象仍然在內存中,直到匿名函數被銷毀。
//取消引用匿名函數(以釋放內存)
比較?=?null原因是:
瀏覽器垃圾收集方法有:
標記清除(主要針對變量)
引用計數(記錄每個值被引用的次數)
二、示例操作
封裝功能
var?路線?=?{
路線:?{},
對於:?函數(路徑,handler){?//閉包
this.routes[path]?=?處理者;//引用回調函數
}
};
//執行兩個匿名函數。
route.for("/start ",函數(request,響應){
response.writeHead(200,{"Content-Type ":?" text/plain " });
response . write(" Hello ");
response . end();
});
route.for("/finish ",函數(request,響應){
response.writeHead(200,{"Content-Type ":?" text/plain " });
response.write(“再見”);
response . end();
});
//首先判斷參數中的路徑變量是否壹致,以及其函數中的回調函數是否可以調用。
if(typeof?route.routes["/finish"]?===?函數'){
route.routes["/finish"](請求,?回應);
}