zoukankan      html  css  js  c++  java
  • 关于Javascript闭包的理解(二)

    先看看闭包的科学的定义:闭包是可以包含自由(未绑定)变量的代码块;这些变量不是在这个代码块或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量的存在,相关变量引用没有释放)和为自由变量提供绑定的计算环境(作用域)。

    听上去有点晕,我说说我的理解。闭包是一个受到了保护的变量空间,由内嵌函数生成。用到闭包通常是为了解决变量的作用域问题。我举两个使用闭包的例子,也许看例子比什么都明白。

    例子1:循环对多个按钮绑定click事件。

    不用闭包的情况:

    1. <html>
    2. <head>
    3. <script type="text/javascript">
    4. function OnLoad()
    5. {
    6.     var arr = document.getElementsByTagName("input");
    7.     for(var i=0;i<arr.length;i++)
    8.     {
    9.         arr[i].onclick=function(){
    10.             alert(i);
    11.         }
    12.     }
    13. }
    14. </script>
    15. </head>
    16. <body onload="OnLoad()">
    17. <input type="button" name="button" value="button1" />
    18. <input type="button" name="button" value="button2" />
    19. <input type="button" name="button" value="button3" />
    20. <input type="button" name="button" value="button4" />
    21. <input type="button" name="button" value="button5" />
    22. <input type="button" name="button" value="button6" />
    23. <input type="button" name="button" value="button7" />
    24. </body>
    25. </html>

    猛点这里测试结果,你发现不管点哪个按钮,都会弹出7。原因是当你点击buttun时,循环已经执行完毕,这时候i就等于7.

    再看看使用闭包的情况

    1. <html>
    2. <head>
    3. <script type="text/javascript">
    4. function OnLoad()
    5. {
    6.     var arr = document.getElementsByTagName("input");
    7.     for(var i=0;i<arr.length;i++)
    8.     {
    9.         arr[i].onclick=closureTest(i);
    10.     }
    11. }
    12. function closureTest(i)
    13. {
    14.     return function(){
    15.         alert(i);
    16.     }
    17. }
    18. </script>
    19. </head>
    20. <body onload="OnLoad()">
    21. <input type="button" name="button" value="button1" />
    22. <input type="button" name="button" value="button2" />
    23. <input type="button" name="button" value="button3" />
    24. <input type="button" name="button" value="button4" />
    25. <input type="button" name="button" value="button5" />
    26. <input type="button" name="button" value="button6" />
    27. <input type="button" name="button" value="button7" />
    28. </body>
    29. </html>

    猛点这里测试结果,你发现会像你想象的那样,button按钮一次会弹出0、1、2、3、4、5、6。这就是典型的利用闭包来影响变量的作用域的示例。当然,闭包能做很多不同的事情,但究其原理,还是通过影响变量的作用域来实现的。

    转载:http://www.playgoogle.com/post/66.html

  • 相关阅读:
    Binary Tree Inorder Traversal
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Majority Element
    Excel Sheet Column Number
    Reverse Bits
    Happy Number
    House Robber
    Remove Linked List Elements
    Contains Duplicate
  • 原文地址:https://www.cnblogs.com/xiaopin/p/1880608.html
Copyright © 2011-2022 走看看