美文网首页
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闭包及应用场景

    1、什么是闭包 闭包是指有权访问另一个函数作用域中的变量的函数。 以代码进行阐释: 在这个例子中,突出的那两行代码...

  • Javascript闭包、闭包应用场景和实例

    建议参考博客:http://www.ruanyifeng.com/blog/2009/08/learning_ja...

  • 笔记:JavaScript闭包

    本文摘录及参考自:1. 学习Javascript闭包(Closure)2. 闭包的秘密3. JavaScript ...

  • 关于JavaScript中的闭包及应用场景

    对于前端开发工程师来讲,闭包是一个很难弄懂而且十分难征服的一个概念!因为闭包的生成不仅仅与变量的作用域相关而且与变...

  • JavaScript闭包

    闭包(closure)是 Javascript 语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 闭包...

  • JavaScript函数(二)闭包closure

    闭包 闭包(closure)是 JavaScript 语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。...

  • JS闭包

    闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 要...

  • 闭包1(基础)

    (什么是闭包?闭包的作用?闭包的缺陷?) (闭包的几种可能的应用场景) (闭包与内存泄漏,有关闭包的面试题) 推荐...

  • js闭包 详解

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 闭包的特...

  • 详解js闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 闭包的特...

网友评论

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

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