zoukankan      html  css  js  c++  java
  • javascript 闭包

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>无标题文档</title>
    <script type="text/javascript">
    //1:什么是闭包?  函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制收回。
      function aaa(a)
      {
             var b=5
            function bbb()
            {
                alert(a);
                alert(b)
            }
      }
      aaa(); //执行完毕后变量a,b不会被垃圾回收机制收回
      
      //js中的垃圾回收机制
      function ccc()
      {
        var a=1;
      }
      ccc();//执行完毕变量a被垃圾回收机制回收*/
      
      function ddd()
      {
         var a=5;
         function eee()
         {
            alert(a);
         }
         return eee;
      }
      var c=ddd();//执行完毕变量a未被垃圾回收机制回收
       c();  //5   变量a还存在
       
       
       
       //2:闭包的好处: a:希望一个变量长期驻扎在内存中, b:避免全局变量的污染,c:私有成员的存在。
       
         var a=1;
         function aaa()
         {
             i++;
             alert(a);
         }
       aaa()    //2
       aaa()    //3    
       alert(a)    //因为a是全局变量所以还能找到  
       
       
       
       //提高性能避免全局变量
       function  aaa()
       {
          var a=1;
          a++;
          alert(a);
       } 
       
       aaa();  //2   
       aaa();  //2   调用一次后被回收,所以依然是2
       
       //a是局部变量,同时做到累加,闭包能做到。
       function aaa()
       {  
           var a=1;
           return function()
           {
               a++;
               alert(a);
           }
       }
       
       var b=aaa();
       b();   //2
       b();   //3 
       alert(a)  //报错,因为a是局部变量
       
       
       //函数声明改为函数表达式,
       function aaa()  //函数声明
       {
          alert(1);
       }
       aaa();
       
       ( function aaa()  //函数表达式
       {
          alert(1);
       })();  //自执行
       
        ( function()  //函数表达式,可以不需要名字,因为我只需让它执行
       {
          alert(1);
       })();
       
       
       //改写上面的闭包 ,叫做模块化代码
       var aaa=(
          function()
          {
              var a=1;
              return function()
              {
                 a++;
                 alert(a);
              } 
          }
       
       )();
       
       aaa(); //2
       aaa(); //3
       
       
       //私有成员的存在,模块化代码
       var aaa=(
           function()
           {
               var a=1;
               
               function bbb()
               {
                  a++;
                  alert(a);
               }
               function ccc()
               {
                  a++;
                  alert(a);
               }
               
               return {
               
                   b:bbb,
                   c:ccc
               }
           
           }
       )();
       
       aaa.b();  //2
       aaa.c();   //3
       
       //在循环中找到对应的索引
       window.onload=function()
       {
           var aLi=document.getElementsByTagName('li');
           for(var i=0;i<aLi.length;i++)
           {
               aLi[i].onclick=function()
               {
                   alert(i);    //2 点击每个都会弹出2,因为我点击时循环已经结束
               }
               
               //利用壁包改写
               (function(i){
                    aLi[i].onclick=function()
                   {
                        alert(i)
                   }
               })(i);
               
               //另一种改写
                 aLi[i].onclick=(function(i){
                     return function()
                     {
                        alert(i);
                     }
                 })(i);
              
           }
       
       
          //3:IE下会引发内存泄漏
            var oDiv=document.getElementById('div1');
            
            oDiv.onclick=function()  //因为onclick属性引用了function函数,
            {                         
                alert(oDiv.id);       //而function内部的oDiv.id又引用了外部的oDiv对象,互相引用,所以会内存泄漏。
            }
          
            //解决方法一:
            window.onunload=function()
            {
                oDiv.onclick=null;
            }
            
            //解决方法二:
            var oDiv=document.getElementById('div1');
            
            var id=oDiv.id;
            oDiv.onclick=function()
            {
               alert(id);
            }
            oDiv=null;
            
       }
      
       
       
       
    </script>
    </head>
    
    <body>
    <div id="div1"></div>
    <ul>
    <li>111</li>
    <li>222</li>
    <li>333</li>
    </ul>
    </body>
    </html>
  • 相关阅读:
    HDU1013 Digital Roots
    DP---背包问题
    新生代与老年代
    JVM常见问题(二)
    JVM常见问题 一(转载)
    JVM内存模型及分区
    (转载)JVM知识小集
    类加载机制:全盘负责和双亲委托
    mysql 函数GROUP_CONCAT(temp.amount SEPARATOR ',')的用法
    mysql优化--explain关键字
  • 原文地址:https://www.cnblogs.com/zcttxs/p/3076445.html
Copyright © 2011-2022 走看看