Js函數閉包的理解及閉包存在一些問題的解決


函數閉包

  • 函數就是閉包,當一個函數被創建時,它的內部的語句、變量、函數等,共同形成了閉包。

    這里簡單分析下閉包函數執行調用過程
       function outer(){
         var a = 12;
         //形成閉包環境中的變量不是一成不變的,可以被更改
         function inner(){
         console.log(a ++);
         }
         return inner;
         }
        ​
         var inn = outer();
         inn();
         inn();

閉包的用途:

可以在函數外部讀取函數內部成員

讓函數內成員始終存活在內存中

閉包存在的問題

    //閉包的問題
     var arr = [];
     for(var i = 0;i <= 10;i ++){
             arr[i] = function (){
             console.log(i);
          }
     }
    ​
     //應該是輸出對應下標
     arr[0]();//11
     arr[1]();//11
     arr[2]();//11</pre>
這個代碼只是想實現根據arr下標,console.log出相應的值。但是當調用時,for循環中的i已經執行完了,i = 11。i的作用域太大了,執行時,i的結果就已經執行完了。
解決方法就是形成一個閉包,將i的作用域從全局縮小變成局部作用域,arr[i]()每執行一次,i的值就執行一次,使i的值依舊可以使用。
       //解決
       var arr = [];
       for (var i = 0; i <= 10; i++) {
       //自調用函數
       (function (i){
       arr[i] = function () {
       console.log(i);
       }
       })(i); 
       }
      ​
       //應該是輸出對應下標
       arr[0]();//0
       arr[1]();//1
       arr[2]();//2


免責聲明!

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



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