闭包
什么是闭包
函数内部,使用了函数外部的变量,此时就会生成闭包
闭包的产生分为两个阶段(预编译阶段和执行阶段):
- 预编译阶段:若发现内部函数,使用了外部的变量,则在内存中生成一个“闭包”;若该闭包已存在,则在该闭包内生成对应的变量
- 执行阶段:执行完成后,执行上下文会被摧毁。虽然函数外部的上下文被摧毁,但函数内部对闭包的“引用”依然保存,即被引用的对象依旧保持
闭包的优点和缺点:
- 优点:
- 可以从内部函数访问外部函数的作用域中的变量,且访问到的变量长期驻扎在内存中,可供之后使用
- 避免变量污染全局
- 把变量存到独立的作用域,作为私有成员存在
- 缺点:
- 对内存消耗有负面影响。因内部函数保存了对外部变量的引用,导致无法被垃圾回收,增大内存使用量,所以使用不当会导致内存泄漏
- 对处理速度具有负面影响。闭包的层级决定了引用的外部变量在查找时经过的作用域链长度
- 可能获取到意外的值(captured value)
使用场景
典型应用是模块封装,在各模块规范出现之前,都是用这样的方式防止变量污染全局。var Yideng = (function () {
// 这样声明为模块私有变量,外界无法直接访问
var foo = 0;
function Yideng() {}
Yideng.prototype.bar = function bar() {
return foo;
};
return Yideng;
}());