闭包的形成与变量的作用域以及变量的生存周期有密切的关系
关于变量及变量声明周期 链接
闭包的形成
Javascript允许使用内部函数,可以将函数定义和函数表达式放在另一个函数的函数体 内。而且,内部函数可以访问它所在的外部函数声明的局部变量、参数以及声明的其 他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会 形成闭包。常见的闭包写法就是简单的函数套函数,通过另一个函数访问这个函数的 局部变量,利用闭包可以突破作用域链,将函数内部的变量和方法传递到外部,延续变 量的生命。使用闭包可以减少全局环境的污染,也可用延续变量的生命。
闭包的适用场景
-
减少全局环境的污染生成独立的运行环境
模块化就是利用这个特点对不同的模块都有自己独立的运行环境,不会和全局冲突, 模块和模块之间通过抛出的接口进行依赖使用 以及像我们常用的jquery类库(避免和全局冲突使用闭包实现自己独立的环境) -
可以通过返回其他函数的方式突破作用域链
可以利用这个功能做一些值的缓存工作,例如常见的设计模式(单例模式),以及现 在比较火的框架vue中的计算属性
其实当遇到以下场景的时候都可以使用闭包
- 维护函数内的变量安全,避免全局变量的污染。
- 维持一个变量不被回收。
- 封装模块
闭包的缺点
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大。所以在闭包不用之 后,将不使用的局部变量删除,使其被回收。在IE中可能导致内存泄露,即无法回收 驻留在内存中的元素,这时候需要手动释放。