zoukankan      html  css  js  c++  java
  • JS闭包的简单理解。优缺点以及垃圾回收机制

    闭包是什么?

    ·了解闭包首先了解js的‘链式作用域’结构,对象可以一级一级的向上查找父对象的变量,所以父对象的变量对子对象可见,反之不成立;所以都可以访问全局变量

    ·为了解决函数外部无法访问函数内局部变量的问题,就在父函数中定义一个子函数并让它访问了父函数的局部变量,再通过父函数返回该子函数就实现了调用局部变量的效果;

    ·而上面中的子函数就是闭包,所以闭包的定义是“能够读取其他函数内部变量的函数”,其实简单理解就是“一个定义在函数中的函数”;

    示例

        

      function parent(){
    var a=1,b=2;
             function child(){
                console.log(a+b);
             }
             return child;
          }
          var func1=parent(); //这是将子函数返回给变量
          func1();

    使用闭包有什么好处?

    在内存中维持一个变量,由于闭包,f1中的n只有通过f2方法访问到,无法通过其他途径访问修改,从而达到了保护变量安全的效果;通过闭包实现了js私有属性和私有方法的效果;

        function f1(){

        //闭包f2被外引用始终存在内存中,而它所依赖的f1也会始终存在

        //所以n,m都是始终存在,删除闭包直接f1=null;

        n=1,m=100;

        madd=function(){

        m+=10;

        alert(m);

        }  //全局变量madd

        function f2(){

        n+=1;

        alert(n);

        }

        return f2;

        }

        var a=f1(); //将子函数返回赋值给了变量a

        a();

        madd();

        //madd的值是一个匿名函数,同时是一个闭包,实现了外部对函数内部进行操作

        a();

    使用闭包的注意点:

    ·闭包会使函数中的变量一直存在内存上会导致内存消耗过大,所以不能滥用闭包,否则会造成网页性能问题,IE可能会造成内存溢出。最好的方式是在退出闭包前将不必要的局部变量删除。

    ·JavaScript垃圾回收机制,如果一个对象不再被引用,那么这个对象就会被GC回收,如果两个对象相互引用,而不再被第三方引用,那么这两个对象会被GC回收,上述父函数被子函数引用,子函数又被外部c引用,这就是父函数不被回收的原因;

    ·作用域链时为了保证在执行环境中有权访问的变量和方法是有序的,只能向上访问,到window终止,即作用域链向下访问是不被允许的;

  • 相关阅读:
    不要随便用#define 沉沉_
    转载堆和栈的区别 沉沉_
    转载include包含源文件引发的错误 沉沉_
    浅议C和C++中的内存分配 沉沉_
    volatile 的应用 沉沉_
    Debian显示txt乱码
    Debian 64位安装wink
    Debian安装vmware虚拟机
    Debian安装scim中文、日语输入法
    Debian安装chrome
  • 原文地址:https://www.cnblogs.com/plBlog/p/11815314.html
Copyright © 2011-2022 走看看