zoukankan      html  css  js  c++  java
  • javascript闭包的一个例子

    <html>
    <head>
        <title>elementFromPoint</title>
        <script type="text/javascript">
     window.onload = function(){  
            for(var i=0; i<6; i++){  
                var alink = document.createElement('a');  
                var titleText = document.createTextNode(' ' + (i+1) + ' ');  
                alink.appendChild(titleText);  
                alink.href = "javascript:void(0)";  
                alink.onclick = function(){alert(i)};
                var div = document.getElementById('show-detail');         
                div.appendChild(alink);  
            }  
        }  
        </script>
    </head>
    <body>
    
    <div id="show-detail">   </div> 
    </body>
    </html>

    这是一组link,你会发现点击任何一个link,结果总是6。为什么?

    解释:这是因为这6个link每次单击时,都会触发函数:function(){alert(i)};,这个函数的作用就是打印当前的i值,而添加完6个link标签后,内存中的i值已经变成了6,因此单击任何一个link,都会弹出6。

    而我们的本意是想单击任何link时,都会弹出对应的数字,这该怎么解决?解决方法就是javascript的闭包特性

    闭包--------------------------------------------------------------------------------------------------------------------------------------------

    关于闭包,可以看以下网址:

    http://www.jb51.net/article/24101.htm

    闭包简单的说,就是当函数a的内部函数b被函数a外的一个变量C引用的时候,就创建了一个闭包。闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。例子如下:

    function a(name) 
    { 
       var num=0;
       function b() 
       { 
            alert("name:"+name+";num:"+num);
            num++;
       } 
       return b;
    }
    var c = a("c");
    var d = a("d");
    c();   //name:c;num:0
    d();   //name:d;num:0
    c();   //name:c;num:1
    d();   //name:d;num:1

    由于闭包特性,a一直存在于内存中,每一次运行c()或者d(),c和d对应的a对象都会num++。关于这一部分有一个作用域链的概念,不清楚的可以自己查查。

     例子修改------------------------------------------------------------------------------------------------------------------------------------------

    因此,对于上面的例子,我们可以修改如下:

    <html>
    <head>
        <title>elementFromPoint</title>
        <script type="text/javascript">
            window.onload = function(){  
            for(var i=0; i<6; i++){  
                var alink = document.createElement('a');  
                var titleText = document.createTextNode(' ' + (i+1) + ' ');  
                alink.appendChild(titleText);  
                alink.href = "javascript:void(0)";  
                alink.onclick= showI(i);
                var div = document.getElementById('show-detail');         
                div.appendChild(alink);  
            }  
        }  
    
          function showI(i)
          {
              var num=0;
              var a= function(){alert("i:"+i+";num:"+num++);}
              return a;
          }
        </script>
    </head>
    <body>
    
    <div id="show-detail">   </div> 
    </body>
    </html>

    修改后可以看到,点击每一个link,都可以弹出对应的编号

    alink.onclick= showI(i);   alink.onclick指向函数showI中的内部对象a,因此showI对象不会被GC回收,每一个alink对应一个showI对象,单击每一个alink时,会触发各自对应的showI对象;代码中生成了6个alink,同时为这6个alink分别分配了6个“闭包函数”showI(i),每一个闭包函数保存了alink对应的编号i。由于闭包特性,这6个showI对象不会被释放,一致存放于内存中,因此6个link分别单击时,会弹出相应的编号。

    function showI(i)
    {
        var num=0;   //这里加一个num,说明每一个link单击时,num++不会相互影响
        var a= function(){alert("i:"+i+";num:"+num++);}
        return a;
    }

    本文例子取自  http://blog.csdn.net/xiaohai0504/article/details/7735971

  • 相关阅读:
    eclipse的下载安装
    找不到符号 类string
    [转]Android_开源框架_AndroidUniversalImageLoader网络图片加载
    [转]移动web开发经验总结
    测试一下吧
    javascript 的 encodeURIComponent 函数用 Objective-C 实现
    几个Objective-C的HTML解析库
    html test
    一段测试代码
    [转]Embed WebView in Fragment
  • 原文地址:https://www.cnblogs.com/king1302217/p/3806440.html
Copyright © 2011-2022 走看看