在js中進行函數的調用的時候,會爲每一個函數添加一個SCPOE屬性,經過這個屬性laugh指向一塊內存。這快內存中包含全部上下文使用的變量java
當在某個函數中調用新的函數的時候,新函數會有一個做用域來指向原有的SCOPE和新增的SCOPE。這樣就造成了一個做用域鏈。閉包
function compareObject(prop){函數
return function(obj1,obj2){blog
if(obj1[prop]>obj2[prop]){return 1}內存
else if(obj1[prop]<ob22[prop]){return -1}作用域
else{io
return 0;function
}匿名函數
}變量
}
var o1 = {name:"Amos",age:22};
var 02 = {name:"Ada",age:66};
// 在java中 下面這行代碼執行完畢了以後,傳過去的name的做用域當函數執行完畢確定也就消失了。可是在js中經過返回這個函數。就能夠直接把「name」的做用域
// 擴大。這樣的方式就叫作閉包
var compare = compareObject("name");
var rel = fn(o1,o2);
內存分析:
當執行完compareObject的時候。在釋放變量以前,發現匿名函數仍指向本身的屬性。因此就沒有釋放。