杂七杂八JS : 浅谈闭包一

javascript 专栏收录该内容
10 篇文章 0 订阅

基础概念

  闭包是指有权访问另一个函数作用域的变量的函数。创建闭包的的常用方式,就是一个函数内部创建另一个函数。
  闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等。

   一般来说,函数内部可以访问函数外部的全局变量,      
        var a = 1;//全局变量
        function f1(){
            alert(a);
        }
        f1();//1
        
  函数外部不能访问函数内部的局部变量,
        function f2(){
            var a = 1 ; //局部变量
        }
        alert(a); //error

  注意,在函数内部定义变量时,要加上var,否则该变量就是全局变量了
        function f3(){
            a = 1 ; //全局变量
        }
        alert(a); //1

  但是,有时候我们想得到函数内部的局部变量,那应该如何实现呢?这就引入了闭包的概念。

        function f1(){
            var n =1;

            return function(){
                alert(n)
            }
; } var result = f1(); result();//1

闭包的作用

  1:读取函数内部的变量
        就如上面闭包的例子,可以在函数外部读取函数内部的变量。
  2:将变量的值始终保存在内存中
         一般来讲,当函数执行完毕之后,函数内部的局部活动对象就会被销毁,内存中仅保存全局作用域,即js的内存回收机制。
         如果这个函数内部又嵌套了另一个函数,而这个函数是有可能在外部被调用到的.并且这个内部函数又使用了外部函数的某些变量的话.这种内存回收机制就会出现问题。如果在外部函数返回后,又直接调用了内部函数,那么内部函数就无法读取到他所需要的外部函数中变量的值了.所以js解释器在遇到函数定义的时候,会自动把函数和他可能使用的变量(包括本地变量和父级和祖先级函数的变量(自由变量))一起保存起来.也就是构建一个闭包,这些变量将不会被内存回收器所回收,只有当内部的函数不可能被调用以后(例如被删除了,或者没有了指针),才会销毁这个闭包,而没有任何一个闭包引用的变量才会被下一次内存回收启动时所回收。


注意事项

  1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
  2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。


参考网址:
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
http://www.cnblogs.com/mzwr1982/archive/2012/05/20/2509295.html

  • 4
    点赞
  • 0
    评论
  • 4
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

xixiruyiruyi

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值