zoukankan      html  css  js  c++  java
  • 关于闭包

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

      变量分为两种,一种是全局变量,一种是私有变量,大家都知道,私有变量在函数外部是不可以使用的,但是在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也相应的绑定到了对应的事件中,所以可以正确的输出。

  • 相关阅读:
    window.clearInterval与window.setInterval的用法(
    hibernate 使用in方式删除数据
    hibernate中一对多Set的排序问题
    struts2 标签的使用之一 s:if(遍历中s:if如何用等)
    hibernate使用sql语句查询实体时,要写上addEntity
    struts通过Ajax返回数据时,例如对象类型,没有执行Ajax的回调函数
    hibernate 对象状态异常:object references an unsaved transient instance
    ${}与 $()区别
    hibernate逆向工程生成的实体映射需要修改
    本地tomcat的start.bat启动时访问不出现小猫图标
  • 原文地址:https://www.cnblogs.com/Upton/p/4694705.html
Copyright © 2011-2022 走看看