快速理解閉包的定義和使用


當一個內部函數被調用,就會形成閉包,閉包就是能夠讀取其他函數內部變量的函數,定義在一個函數內部的函,創建一個閉包環境,讓返回的這個子程序抓住i,以便在后續執行時可以保持對這個i的引用。內部函數比外部函數有更長的生命周期;函數可以訪問它被創建時所處的上下文環境。

示例代碼:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>閉包</title>
        <style type="text/css"> div { width: 100px; height: 100px; background: lightgreen; float: left; margin: 20px; font: 30px/100px "microsoft yahei"; text-align: center; } </style>
    </head>
    <body>
        <div>a</div>
        <div>b</div>
        <div>c</div>
        <div>d</div>
        <div>e</div>
        <div>f</div>
        <div>g</div>
        <div>h</div>
        <div>i</div>
        <div>j</div>
        <script type="text/javascript">
            var divs=document.getElementsByTagName("div"); for (var i=0;i<divs.length;i++) { divs[i].onclick=function(){ alert(i); } } </script>
    </body>
</html>

運行結果:

點擊每一個div都是10,根本原因是var沒有塊級作用域只有函數作用域,而點擊事件的函數內部使用外部的變量i一直在變化,當我們指定click事件時並沒有保存i的副本

修改代碼,使用閉包:

//方法一
for (var i=0;i<divs.length;i++) {
    (function(i){
        divs[i].onclick=function(){
            alert(i);
        }
    })(i)
}

//方法二
for (var i=0;i<$("div").length;i++) {
      $("div")[i].onclick=(function(n){
              return function(){
                   alert(n);
              }
      })(i)
}

結果:

總結:

(1)外界無法訪問閉包內部的數據,如果在閉包內聲明變量,外界是無法訪問的,除非閉包主動向外界提供訪問接口;

(2)一般的函數,調用完畢之后,系統自動注銷函數,而對於閉包來說,在外部函數被調用之后,閉包結構依然保存在

(3)使用閉包會占有內存資源,過多的使用閉包會導致內存溢出等.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM