理解javascript闭包

 更新时间:2015年12月15日 11:41:54   投稿:lijiao  
这篇文章主要帮助大家理解javascript闭包概念优缺点及应用,帮助大家全面的学习javascript闭包,需要的朋友可以参考下

什么是javascript闭包?
javascript允许使用内部函数,内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
简单的javascript闭包例子:

<script>
  function f1(){
    var n=999;
    nAdd=function(){n+=1}
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999
  nAdd();
  result(); // 1000
</script>

在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
 闭包的应用:

var singleton = function () {
  var privateVariable;
  function privateFunction(x) {
    ...privateVariable...
  }
 
  return {
    firstMethod: function (a, b) {
      ...privateVariable...
    },
    secondMethod: function (c) {
      ...privateFunction()...
    }
  };
}();

 这个单件通过闭包来实现。通过闭包完成了私有的成员和方法的封装。匿名主函数返回一个对象。对象包含了两个方法,方法1可以方法私有变量,方法2访问内部私有函数。需要注意的地方是匿名主函数结束的地方的'()',如果没有这个'()'就不能产生单件。因为匿名函数只能返回了唯一的对象,而且不能被其他地方调用。这个就是利用闭包产生单件的方法。

闭包的优势:
(1)不增加额外的全局变量,
(2)执行过程中所有变量都是在匿名函数内部。
闭包的缺点:
(1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

本文就为大家介绍这里,如果大家对javascript闭包还是不够了解,请阅读相关文章进行补充学习,谢谢大家的阅读。

相关文章

  • js实现移动端轮播图

    js实现移动端轮播图

    这篇文章主要为大家详细介绍了js实现移动端轮播图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 轻松掌握JavaScript装饰者模式

    轻松掌握JavaScript装饰者模式

    这篇文章主要帮助大家轻松掌握JavaScript装饰者模式,告诉大家什么是js装饰者模式,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • 自己实现ajax封装示例分享

    自己实现ajax封装示例分享

    这篇文章主要介绍了自己实现ajax封装示例,需要的朋友可以参考下
    2014-04-04
  • 基于JS实现漫画中大雨滂沱的效果

    基于JS实现漫画中大雨滂沱的效果

    这篇文章主要为大家详细介绍了如何利用JavaScript实现漫画中大雨滂沱的效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 用原生JS实现简单的多选框功能

    用原生JS实现简单的多选框功能

    这篇文章主要介绍了用原生JS实现简单的多选框功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-06-06
  • TypeScript开发小状况记录之选且只选一个

    TypeScript开发小状况记录之选且只选一个

    在开发中需要定义一个对象的类型,此类型必须包含某n个字段中的其中一种,这篇文章主要给大家介绍了关于TypeScript开发小状况记录之选且只选一个的相关资料,需要的朋友可以参考下
    2022-10-10
  • js实现简单的日历显示效果函数示例

    js实现简单的日历显示效果函数示例

    这篇文章主要介绍了js实现简单的日历显示效果函数,结合完整实例形式分析了JavaScript实现的日历功能相关原理与具体操作技巧,需要的朋友可以参考下
    2019-11-11
  • 15分钟深入了解JS继承分类、原理与用法

    15分钟深入了解JS继承分类、原理与用法

    这篇文章主要介绍了JS继承分类、原理与用法,结合实例形式较为详细的总结分析了javascript原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承和寄生组合式继承等相关原理及使用方法,需要的朋友可以参考下
    2019-01-01
  • 解决在layer.open中使用时间控件laydate失败的问题

    解决在layer.open中使用时间控件laydate失败的问题

    今天小编就为大家分享一篇解决在layer.open中使用时间控件laydate失败的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • javascript实现在下拉列表中显示多级树形菜单的方法

    javascript实现在下拉列表中显示多级树形菜单的方法

    这篇文章主要介绍了javascript实现在下拉列表中显示多级树形菜单的方法,涉及javascript属性菜单的定义、构造及遍历等技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08

最新评论