关于闭包

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

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

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

举例:


关于闭包_第1张图片
参考MDN

闭包的特性

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

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

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

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

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

使用场景

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

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

3.封装相关的功能集

你可能感兴趣的:(关于闭包)