JavaScript[17] -- 閉包

JavaScript的回收機制

  • 瀏覽器本身作。
  • 全局做用域聲明一個變量不會被回收,只有關閉瀏覽器以後纔回收。
  • 在局部做用域裏面,變量在函數體執行完以後,就會被回收。瀏覽器

    <script>
        function func(){
            var x = 1;
            console.log(x); // 變量x在函數執行完畢後,會被回收
        };
        func();             // 1
        console.log(x);     // x is not defined 
    </script>

閉包

  • 能夠訪問其餘函數做用域裏變量或者參數的函數(閉包會形成局部變量不被銷燬)。閉包

    <script>
        (function(){
             var x = 1;
             console.log(x)
         })();//這不是一個閉包,這只是一個函數表達式的自執行
        
         function fn(){
             var y = 2;
             return y;   //能夠獲取內部函數的變量,但不是閉包
         };
         var b = fn();
         console.log(b);
    
         var m = 1;
         function func1(){
             var m =10;
             return function(){
                 m++;
                 console.log(m);
             }
         }
         var n = func1();
         n();        // 11
    </script>
  • 建立閉包:一個函數裏面嵌套一個函數,內部函數引用外部函數的變量或者參數函數

    <div>11</div>
    <div>22</div>
    <div>33</div>
    <div>44</div>
    <div>55</div>
    
    <script>
        var boxes=  document.getElementsByTagName("div");
        len = boxes.length;
    
        // 建立閉包須要兩個函數
        for(var i = 0; i < len; i++){
           
            // 閉包寫法一
            func1(i);
            function func1(index){
                boxes[index].onclick = function(){
                    console.log(index);
                }
            }
    
            // 閉包寫法二
            (function(index){
                boxes[index].onclick = function(){
                    console.log(index);
                }
            })(i)   // 自執行中帶參數           
        }
    </script>
相關文章
相關標籤/搜索