2019-02-10
回答
闭包是一个定义在其他函数内部的函数,他由函数及创建该函数的词法环境组合而成,这个环境包含了这个闭包创建时所能访问的所有局部变量。闭包可以访问三种作用域中的变量:
- 自身函数内声明的变量
- 父函数作用域中的变量
- 全局中声明的变量
在 JavaScript 中所有函数都是闭包的,因为他们都可以访问外部作用域,但是大部分函数都没有充分利用闭包的优势:状态持久化。因此闭包有时也被称为一个有状态的函数。
此外,闭包是在 JavaScript 中可以使存储的私有数据不能被外部所访问的唯一方式。他们的关键是 UMD(Universal Module Definition)模式,这经常用于 js 库中只暴露公共 API 但隐藏实现细节的场景,这样可以防止和其他库或用户自己的代码发生名称冲突。
加分回答
- 闭包是非常有用的,因为他们能让你将数据和对该数据操作的的函数相关联。
- 闭包可用于模拟私有属性和方法。
- 闭包可以替代只有一个方法的对象。
- 在不必要的情况下,应尽可能避免使用闭包。因为闭包在处理速度和内存消耗方面对脚本的性能具有负面影响。
- 在 ES2015 前,可使用闭包来解决含有循环的异步回调中变量被重用的问题:var