JavaScript闭包

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script>
            //闭包:函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回,
            //闭包有什莫好处,应用在哪:
                //好处:1):希望一个全局变量长期驻扎在内存中;
                      //2):避免全局变量被污染
                      //3):私有成员的存在
                //用法:1):代码模块化,尽可能减少全局变量(可以提高性能),不但可将全局变量私有化,而且可以将全局函数私有化
                      //2):在循环当中可以直接找到对应元素的索引,而不需要加索引;
            //闭包要注意什么:在IE下会引发内存泄漏:指的就是当你页面跳转的时候,你闭包内的变量和函数并不会被清理因此你的CPU就会无限累加,只有当关闭浏览器的时候这些垃圾才会被清理
            //js中的垃圾回收机制:当一个函数被调用之后,(为了介绍内存)其局部变量会被回收;
//          function  aaa(){//一般闭包写法
//              var a=5;//不会被垃圾回收机制回收,应为在bbb函数中一直在应用(相当于bbb函数的全局变量);
//              function bbb(){
//                  alert(a);
//              }
//              return bbb;
//          }
//          var c=aaa();//在这里就相当于c=function bbb(){alert(a);}(aaa函数执行的结果)
//          c();//调用c就相当于,bbb函数执行;
            //
//          var aaa=(function(){//函数表达式写法,(自执行函数)
//              var a=1;
//              return function bbb(){
//                  a++;
//                  alert(a);
//              }
//          })();//执行的结果就是将bbb的(全局变量a保留了下了);然后再调用aaa函数就相当于执行bbb函数,
//          aaa();//2
            //
//          var aaa=(function(){
//              var a=1;
//              function bbb(){
//                  a++;alert(a);
//              }
//              function ccc(){
//                  a++;
//                  alert(a);
//              }
//              return {b:bbb,c:ccc};
//          })();
//          //a,aaa,bbb全是aaa私有成员,在外面调用不到;
//          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);//在这里,每当点的时候循环都执行完了,因此每次弹得都是3,
//                  }//而一般在程序中都会给li添加一个index属性,利用this,
//              }
                //闭包的写法一
//              for(var i=0;i<aLi.length;i++){
//                  (function(i){
//                      aLi[i].onclick=function(){
//                          alert(i);
//                      }
//                  })(i);//在这里利用闭包将i当作参数传进去,让i的值一直存在内存当中,当外部函数执行完不影响内部函数执行
//              }
                //闭包的写法二
                for(var i=0;i<aLi.length;i++){
                    aLi[i].onclick=(function(i){
                        return function(){
                            alert(i);
                        }
                    })(i);
                }               
            }

        </script>
    </head>
    <body>
        <ul>
            <li>111111</li>
            <li>222222</li>
            <li>333333</li>
        </ul>
    </body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值