在javascript中變量有其做用域,若是在函數內部var一個變量,那麼在函數外部通常狀況下是不能被引用的。javascript
function outerFun() { var a =0; alert(a); } var a=4; outerFun(); alert(a);
結果是 0,4 . 由於在函數內部使用了var關鍵字 維護a的做用域在outFun()內部.java
閉包的做用就是使用變通的方法來訪問函數內部的局部變量。閉包
參照下面的例子和輸出結果:函數
function outFun() { var aa = 0; function innerFun() { aa++; alert(aa); } return innerFun;//這裏很重要 } var testFun = outFun(); testFun(); //1 testFun();//2 var testFun2 = outFun(); testFun2();//1
當內部函數 在定義它的做用域 的外部 被引用時,就建立了該內部函數的閉包 ,若是內部函數引用了位於外部函數的變量,當外部函數調用完畢後,這些變量在內存不會被 釋放,由於閉包須要它們.性能
那 麼咱們來想象另外一種狀況,若是outFun返回的不是函數innerFun,狀況就徹底不一樣了。由於outFun執行完後,innerFun沒有被返回給a的外界,只是被outFun所引用,而此時outFun也只會被innerFun引 用,所以函數outFun和innerFun互相引用但又不被外界打擾(被外界引用),函數outFun和innerFun就會被GC回收。spa
閉包另一個做用就是可讓變量常駐內存中,避免被GC回收。因此弊端也很明顯,佔用內存,可能會形成性能問題,在ie中可能致使內存泄露,所以不能濫用閉包,在不用的時候須要刪除。code
因爲在函數外部也能夠修改變量的值,在使用變量的時候要格外當心。blog