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

相关文章
相关标签/搜索