闭包

一.什么是闭包?

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

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

闭包的几种方式:

  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;

};

原文地址:https://www.cnblogs.com/aomore/p/4543419.html