函数闭包

  • 函数就是闭包,当一个函数被创建时,它的内部的语句、变量、函数等,共同形成了闭包。
    Js函数闭包的理解及闭包存在一些问题的解决_Js
    这里简单分析下闭包函数执行调用过程
       function outer(){
         var a = 12;
         //形成闭包环境中的变量不是一成不变的,可以被更改
         function inner(){
         console.log(a ++);
         }
         return inner;
         }
        
         var inn = outer();
         inn();
         inn();

Js函数闭包的理解及闭包存在一些问题的解决_Js_02

闭包的用途:

可以在函数外部读取函数内部成员

让函数内成员始终存活在内存中

闭包存在的问题

    //闭包的问题
     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