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

  • A+
所属分类:Web前端
摘要

可以在函数外部读取函数内部成员让函数内成员始终存活在内存中


函数闭包

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

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

闭包的用途:

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

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

闭包存在的问题

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