关于闭包

第一,利用闭包可以读取外部的变量。

  变量分为两种,一种是全局变量,一种是私有变量,大家都知道,私有变量在函数外部是不可以使用的,但是在js中利用闭包就可以做到。先看个例子:

  function aaa(){

    var a=12;//函数aaa的私有变量

    return function(){

      console.log(a);

    }

  }

  var bbb=aaa();

  bbb();//输出12

  在外部调用bbb函数的时候输出了a这个私有变量,这样做可以避免变量的全局污染。

 第二,可以使某个变量长期存在于内存中。

  function aaa(){
    var a = 1;
    a++;
    console.log(a);
  }
  aaa(); //2
  aaa(); //2

  上面这个函数每次调用的时候都是输出2,下面这个函数就可以让一个变量长期存在。

  function aaa(){

    var a=1;

    return function(){

      a++;

      console.log(a);

    }

   var bbb=aaa();

   bbb();//2

   bbb();//3

第三,在循环中直接找到对应元素的索引。

  比如给一组li添加点击事件,并输出相应的索引,代码如下:

  var oLi=document.getElementsByTagName('li');
  for(var i=0;i<oLi.length;i++){
    /*
      oLi[i].onclick=function(){
        alert(i);
       }
    ;*/   //这样是不能正确取出i值的,会全部输出oLi的长度

    oLi[i].onclick=(function(i){

      return function(){
        alert(i);
      }

    })(i);  //这样就可以正确输出了

  }

  要理解上面的函数,首先要看懂这个函数:

  (function(){
    alert(1);
  })();

  在这里会输出数字1,这种()();的方式会使前面的括号中的内容被立即执行,而后一个括号中可以传递参数。

  现在我们来解释上面给li添加点击事件的函数,当用第一种方式的时候,由于js是单线程的,所以在点击事件未触发之前for循环已经结束了,而i已经所以在点击的时候输出的实际上是最后一个i,第二种方法用到()();方式,这样,在给每个li添加点击事件的时候实际上是给每个li创建了点击事件,而i也相应的绑定到了对应的事件中,所以可以正确的输出。

原文地址:https://www.cnblogs.com/Upton/p/4694705.html