?
JS-IIFE&閉包
- IIFE(立即調用函數表達式)
- 示例
- IIFE實現單例模式
- 閉包
- 計數器例子
- 非閉包實現
- 閉包實現
- IIFE閉包實現
- 內存泄露解決
- 計數器例子
?
IIFE(立即調用函數表達式)
示例
(function iife(){ //直接執行,無需調用console.log("hello");
})(); //上面相當于function iife(){console.log("hello");
}
iife();
注意:為了規范,IIFE的函數名雖無意義,但最好加上
IIFE實現單例模式
var sun=(function(){console.log("sun create..."); //在聲明還未調用時就被直接執行var name="sun";var size=1599;function say(){console.log(name+" "+size);}return{ //返回可供調用的方法或參數say:say,name:name //返回的name只是一個形參}
})();
sun.say();
IIFE的作用:隔離作用域,防止污染全局命名空間
閉包
計數器例子
非閉包實現
var count=0;
function add(){count++;console.log(count);
}
add();
add(); //輸出2
上面的計數器缺點是count是全局的,不具有安全性,易被誤操作。用閉包就可以解決這個問題
閉包實現
function counter(){var count=0; //函數內部定義,不影響全局function add(){count++;console.log(count);}return{add:add};
}
var counter1=new counter();
counter1.add();
counter1.add(); //輸出2
IIFE閉包實現
(function counter(){var count=0;function add(){count++;console.log(count);}window.counter={ //直接把計時器賦給window作為屬性add:add};
})();
//直接調用,不需要new
counter.add();
counter.add(); //輸出2
內存泄露解決
當不需要使用閉包時,閉包仍在占用內存,可能會造成 內存泄露
因此,不使用時可以通過:
counter=null;
此時counter就被釋放了