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

2019-08-20  本文已影响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、闭包的应用场景

上一篇 下一篇

猜你喜欢

热点阅读