javascript理解js中的閉包

在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

相關文章
相關標籤/搜索