• 闭包


    相关链接: http://blog.csdn.net/u011411356/article/details/50208433;

    然后,

    1. var result=[];  
    2. function foo(){  
    3. var i= 0;  
    4. for (;i<3;i=i+1){   
    5. result[i]=function(){   
    6. alert(i)   
    7. }   
    8. }  
    9. };   
    10. foo();  
    11. result[0](); // 3  
    12. result[1](); // 3  
    13. result[2](); // 3  

    这段代码中,程序员希望foo函数中的变量i被内部循环的函数使用,并且能分别获得他们的索引,而实际上,只能获得该变量最后保留的值,也就是说.闭包中所记录的自由变量,只是对这个变量的一个引用,而非变量的值,当这个变量被改变了,闭包里获取到的变量值,也会被改变.

    解决的方法之一,是让内部函数在循环创建的时候立即执行,并且捕捉当前的索引值,然后记录在自己的一个本地变量里.然后利用返回函数的方法,重写内部函数,让下一次调用的时候,返回本地变量的值,改进后的代码:

    [javascript] view plain copy
     
    1. var result=[];  
    2. function foo(){  
    3.     var i= 0;  
    4.     for (;i<3;i=i+1){  
    5.         result[i]=(function(j){  
    6.             return function(){  
    7.                 alert(j);  
    8.             };  
    9.         })(i);  
    10.     }  
    11. };  
    12. foo();  
    13. result[0](); // 0  
    14. result[1](); // 1  
    15. result[2](); // 2  

    如图所示,确实有了闭包,但是里面都是3:

    今日用闭包意外发现,闭包比不是闭包多了个

    闭包图,

    closure [ˈkləʊʒə(r)] [ˈkloʊʒə(r)]
    n. 结束; (永久的) 停业,关闭; [电] 闭合; [数] 闭包;
    vt. 使结束,使终止; 使停止辩论;

    通过添加属性的图

    代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head>
    <body>
    <h3>innerHTML</h3>
    <div id="div1">
    <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    </ul>
    </div>
    <h3>点的是第几个</h3>
    <div id="div2">
    <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    </ul>
    </div>
    <h3>闭包实现点的是第几个,内存泄漏未回收</h3>
    <div id="div3">
    <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    </ul>
    </div>
    <h3>闭包实现点的是第几个2,内存泄漏未回收</h3>
    <div id="div4">
    <ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    </ul>
    </div>
    <script type="text/javascript">
    //伪数组不能添加点击事件,必须是单个dom对象才能添加点击事件。
    var div1 = document.getElementById("div1");
    var oLi = div1.getElementsByTagName('li');
    for (var i = oLi.length - 1; i >= 0; i--) {
    oLi[i].onclick=function() {
    alert(this.innerHTML);
    }
    }

    var div2 = document.getElementById("div2");
    var oLi = div2.getElementsByTagName('li');
    for (var i = oLi.length - 1; i >= 0; i--) {
    oLi[i].index=i;
    oLi[i].onclick=function() {
    alert(this.index);
    }
    }
    console.log(oLi)
    var div3 = document.getElementById("div3");
    var oLi = div3.getElementsByTagName('li');
    for (var i = oLi.length - 1; i >= 0; i--) {
    oLi[i].onclick=(function(i){
    return function(){
    alert(i);
    }
    })(i)
    }
    console.log(oLi)
    var div4 = document.getElementById("div4");
    var oLi = div4.getElementsByTagName('li');
    for (var i = oLi.length - 1; i >= 0; i--) {
    (function(i){
    oLi[i].onclick=function(){
    alert(i)
    }
    })(i)
    }
    </script>
    </body>
    </html>

  • 相关阅读:
    【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程
    【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享
    【转】 Pro Android学习笔记(八五):了解Package(4):lib项目
    【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
    【转】 Pro Android学习笔记(八三):了解Package(2):包签名过程
    【转】 Pro Android学习笔记(八十):服务(5):访问远程服务
    【转】 Pro Android学习笔记(八一):服务(6):复杂数据Parcel
    【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件
    Windows2008 R2上完全卸载Oracle操作步骤(转)
    win7系统清除USBSTOR记录
  • 原文地址:https://www.cnblogs.com/zhangzs000/p/6357289.html
Copyright © 2020-2023  润新知