JS-IIFE&閉包
IIFE(當即調用函數表達式)
示例
(function iife(){ //直接執行,無需調用 console.log("hello"); })(); //上面至關於 function iife(){ console.log("hello"); } iife();
注意:爲了規範,IIFE的函數名雖無心義,但最好加上html
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的做用:隔離做用域,防止污染全局命名空間java
閉包
計數器例子
非閉包實現
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就被釋放了spa