zoukankan      html  css  js  c++  java
  • 闭包

    一.什么是闭包?

    闭包其实是一种机制,在函数运行时产生的一个私有作用域,来保护里面的私有变量不受外界的影响.闭包的作用说的更直白一些就是为了让变量更安全,让一个环境中的变量与其他环境中的变量隔离开不产生冲突.

    匿名方法里的变量属于自己的私有作用域,这个运行的匿名方法就形成了闭包,如果再这个匿名方法想用全局变量,可以通过传参数的方式传给这个匿名函数.

    闭包的几种方式:

      1.函数嵌套函数

        function aaa(a){

          var b = 5;

          function bbb(){

            b++

            alert(b);

            alert(a);

                     };

        };

           1-1.

               function aaa(){

           var a = 1;

                  return function bbb(){

          a++;

          alert(a);

                  };

               };

               var b = aaa(); 

        b();    //2

        b();    //3

    以上代码就构成了一个函数嵌套函数的关系,而这个变量a相对于在这个内部函数当中是可以被找到的,而且它不受外部函数执行完毕的影响,所以说当外部函数执行完毕的时候,内部函数依然可以调用到这个a.

       2.()();

    闭包的垃圾回收机制:这里的变量a和b都是不会被回收的,因为它们都要在这个内部函数当中被引用,所以不会被垃圾回收机制所收回.

    JS中的垃圾回收机制:function aaa(){var a=1};aaa();

    当这个函数执行完之后,这个变量aaa就会被垃圾回收机制收回,就不存在了,是为了节省内存.

    二.闭包有什么好处?应用在哪里?

    1.希望一个变量长期驻扎在内存中.

    2.避免全局变量的污染.

    ()();==>代码模块化:让变量既在外部访问不到,又可以被内部函数引用,从而减少了全局变量污染

    3.循环绑定事件在里面找到索引值,选项卡案例.

    三.闭包需要注意的地方.

    在IE下有可能会引发内存泄露.如果内存泄露,当页面跳转的时候,这个变量不会被释放,一直存在于内存当中,使CPU累加,只有在关闭浏览器的时候才能释放内存

    什么情况会引发IE内存泄露?    如下面的代码所示:当一个变量,这个变量是通过获取DOM节点或者是一个宿主对象的时候,它的一个属性(如下面代码所示的onclick)去引用一

    个内部函数,而这个内部函数当中的变量又去引用外部的变量,这样就会存在内存泄露.IE下有这样的特点,JS中的对象的属性(如绑定的事件)去引用内部的时候,内部又引用了外

    部.就会造成内存泄露.

    如何解决内存泄露?

    在事件结束后,后面加一个事件,如下所示

    window.onload = function(){

      var oDiv = document.getElementById("div1");

      oDiv.onclick = function(){

        alert(oDiv.id);

      };

      第一种解决内存泄露方法

      window.onunload =function(){

       oDiv.onclick = null;

      };

    };

    第二种解决内存泄露的方法:

    window.onload = function(){

      var oDiv = document.getElementById("div1");

         var oId = oDiv.id;

      oDiv.onclick = function(){

        alert(oId);

      };

      oDiv = null;

    };

  • 相关阅读:
    触发器_01(trigger)
    24.Show table status解析
    Mysql排名问题
    zabbix监控
    MyFlash工具
    23.Sharding:谁都能读懂的分库、分表、分区
    Mysql集群结构说明
    Percona XtraDB Cluster(PXC) Mysql集群
    mysql-router
    MGR搭建的过程中遇见的错误以及处理方法
  • 原文地址:https://www.cnblogs.com/aomore/p/4543419.html
Copyright © 2011-2022 走看看