学会奔跑!

闭包浅析

什么是闭包

官方的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

简单来说:js中所有的函数都是一个闭包。不过一般来说,嵌套的函数所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”。

闭包的特点

1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。

2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
变量的作用域
要理解闭包首先需要先理解变量的作用域
变量的作用域包括全局变量和局部变量两种
全局变量:
<script>
    var k=3;
    function f1(){
        alert(k)
    }
    f1();//3
</script>

这里的k属于全局变量在函数内部能使用k这个变量

局部变量:

<script>
    function f1(){
        var k=3;
    }
    alert(k)//k is not defined
</script>

这里的k就属于局部变量在f1()函数外是取不到k的值的 当然这里的k前面有var声明 如果前面没有var提前声明的话 他就变成了一个全局变量

<script>
    function f1(){
        k=3;
    }
    f1();
    alert(k)//3
</script>

下面看一个例子

 

<script>
    function f1(){
        n=3;
        function f2(){
            alert(n);
        }
    }
    f2();//f2 is not defined
</script>

 

上面的代码是错误的 f2()的作用域在函数f1()的内部 所以在f1()的函数外部调用f2()是错误的 在这里想要在f1()外部调用f2()里面的内容 就需要用到下面的代码 也就是闭包

 

<script>
    function f1(){
        n=3;
        function f2(){
            alert(n);
        }
        return f2();//注意
    }
    f1();//3
</script>

什么是闭包:当内部函数在他的作用域外的地方被引用时,就是闭包;

闭包缺点:常驻内存会增大内存使用量,使用不当很容易造成内存泄露。例如:当内部函数f2()用到f1()的变量n 当f1()执行完毕后 n不会被释放 因为f2()需要用到n

 

posted @ 2016-08-03 15:12  loriby  阅读(133)  评论(0编辑  收藏  举报
点击进入