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

  • 相关阅读:
    PHP保留小数的相关方法
    ASP.NET Core MVC 之过滤器(Filter)
    ASP.NET Core MVC 之控制器(Controller)
    ASP.NET Core MVC 之视图组件(View Component)
    ASP.NET Core MVC 之局部视图(Partial Views)
    标签助手(TagHelper)
    ASP.NET Core MVC 之布局(Layout)
    ASP.NET Core MVC 之视图(Views)
    ASP.NET Core MVC 之模型(Model)
    九卷读书:淘宝从小到大的发展 -重读《淘宝技术这十年》
  • 原文地址:https://www.cnblogs.com/king1302217/p/3806440.html
Copyright © 2011-2022 走看看