关于闭包

闭包的英文是closure,又称词法闭包(Lexical Closure)和函数闭包(Function Closure)

概念:闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures

是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

举例:


参考MDN

闭包的特性

1.封闭性:外界无法访问到闭包内部的数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口。

2.持久性:一般的函数调用结束之后,系统会自动注销函数。而对于闭包来说,在外部函数被调用之后,闭包结构依然保存在系统中,闭包中的数据依然存在,从而实现对数据的持久使用。

优点:1.保护内部变量不被外界所污染,内部变量也不污染外部变量。2.可以通过返回值访问内部变量的值。3.封装

缺点:使用闭包会占有内存资源,过多的使用闭包会导致内存溢出等。(转载)

在IE9之前,如果闭包的作用域链中保存着一个HTML元素,那么意味着该元素无法被销毁。这里DOM对象element引用闭包函数,闭包函数作用域引用DOM对象,循环引用导致内存泄露。
解决方法:先把element.id用局部变量id保存起来,并且在闭包中引用该变量消除了循环引用。但是,这样还不能消除内存泄露,闭包会引用包含函数的活动变量,而其中会有element。即使闭包闭包不直接引用element,包含函数的活动对象仍然会保存一个引用,因此有必要把element设为null。

使用场景

1.采用函数引用方式的setTimeout调用。

2.将函数关联到对象的实例方法

3.封装相关的功能集

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 为什么写这篇文章:网上关于闭包的解释五花八门,很多人自己往往也未清楚闭包,就尝试用蹩脚的语言去描述它,而闭包是一个...
    泽拉丶阅读 388评论 0 0
  • 本文章著作权归饥人谷_Lyndon和饥人谷所有,转载请注明出处。 闭包对于我而言是一个难点,但闭包又是一个很有用的...
    HungerLyndon阅读 1,082评论 1 3
  • 卡尔维诺中文站留言板这个帖子专门用作卡尔维诺中文站的留言板,欢迎大家留言和提问。...阮一峰2007-01-04T...
    舟渔行舟阅读 331评论 0 1
  • 本文转自微信公众号“三节课” 原文地址,作者GaraC 知乎帐号:GaraChenV 一直想找机会写写关于原型的事...
    杨小九阅读 615评论 0 2
  • 此无酒 我有心为你沏一壶 莫盼青山早来鸿 只是君别迟 此热香消 也只是换盏之间。。 如若路途远 君何不为我普一曲 ...
    超度自己阅读 340评论 0 0