美文网首页
2019-08-20 JavaScript闭包及应用场景

2019-08-20 JavaScript闭包及应用场景

作者: 我的昵称好听吗 | 来源:发表于2019-08-20 10:36 被阅读0次

    1、什么是闭包

    闭包是指有权访问另一个函数作用域中的变量的函数。

    以代码进行阐释:

    function createComparisonFunction(propertyName) { 
      return function(object1, object2){ 
          var value1 = object1[propertyName]; 
          var value2 = object2[propertyName]; 
      
          if (value1 < value2){ 
              return -1; 
          } else if (value1 > value2){ 
              return 1; 
          } else { 
              return 0; 
          } 
      }; 
    } 
    

    在这个例子中,突出的那两行代码是内部函数(一个匿名函数)中的代码,这两行代码访问了外部函数中的变量 propertyName。即使这个内部函数被返回了,而且是在其他地方被调用了,但它仍然可以访问变量 propertyName。之所以还能够访问这个变量,是因为内部函数的作用域链中包含createComparisonFunction()的作用域。

    2、闭包的作用

    闭包的作用域链包含着它自己的作用域、包含函数的作用域和全局作用域。

    • 模仿块级作用域
    function createFunctions(){ 
         var result = new Array(); 
             for (var i=0; i < 10; i++){ 
                 result[i] = function(){ 
                     return i; 
             }; 
         } 
         return result; 
    } 
    

    这个函数会返回一个函数数组。表面上看,似乎每个函数都应该返自己的索引值,即位置 0 的函数返回 0,位置 1 的函数返回 1,以此类推。但实际上,每个函数都返回 10。因为每个函数的作用域链中都保存着 createFunctions() 函数的活动对象,所以它们引用的都是同一个变量 i 。 当createFunctions()函数返回后,变量 i 的值是 10,此时每个函数都引用着保存变量 i 的同一个变量对象,所以在每个函数内部 i 的值都是 10。但是,我们可以通过创建另一个匿名函数强制让闭包的行为符合预期,如下所示。

    function createFunctions(){ 
         var result = new Array(); 
         for (var i=0; i < 10; i++){ 
             result[i] = function(num){ 
                 return function(){     
                     return num;     
                 }; 
             }(i);
         } 
         return result; 
    } 
    

    3、闭包的应用场景

    • 保护函数内的变量安全,防止外部修改。
    • 在内存中维持一个变量,防止被回收。

    相关文章

      网友评论

          本文标题:2019-08-20 JavaScript闭包及应用场景

          本文链接:https://www.haomeiwen.com/subject/ibuusctx.html