1. 匿名自執行函數javascript
咱們在實際狀況下常常遇到這樣一種狀況,即有的函數只須要執行一次,其內部變量無需維護,那麼咱們可使用閉包:java
如頁面加載完給多個li改變文本 閉包
//將所有li字體變爲紅色 (function(){ var els = document.getElementsByTagName('li'); for(var i = 0,lng = els.length;i < lng;i++){ els[i].style.color = 'red'; } })();
咱們建立了一個匿名的函數,並當即執行它,因爲外部沒法引用它內部的變量,
所以els,i,lng這些局部變量在執行完後很快就會被釋放,節省內存!
關鍵是這種機制不會污染全局對象。模塊化
2. 實現封裝/模塊化代碼函數
var person= function(){ //變量做用域爲函數內部,外部沒法訪問 var name = "default"; return { getName : function(){ return name; }, setName : function(newName){ name = newName; } } }(); console.log(person.name);//直接訪問,結果爲undefined console.log(person.getName()); //default person.setName("loren"); console.log(person.getName()); //loren
內容泄漏大多數都是變量循環調用沒有即時的清理,因此一直存在內存裏面。
清理方法
var obj = { // 定義變量
x:1
}
obj= null; // 清除變量
優勢:字體
可讓一個變量常駐內存 (若是用的多了就成了缺點ui
避免全局變量的污染 spa
私有化變量code
缺點對象
由於閉包會攜帶包含它的函數的做用域,所以會比其餘函數佔用更多的內存
引發內存泄露