前端面试之闭包

69 阅读2分钟

闭包

什么是闭包

函数内部,使用了函数外部的变量,此时就会生成闭包

闭包的产生分为两个阶段(预编译阶段和执行阶段):

  • 预编译阶段:若发现内部函数,使用了外部的变量,则在内存中生成一个“闭包”;若该闭包已存在,则在该闭包内生成对应的变量
  • 执行阶段:执行完成后,执行上下文会被摧毁。虽然函数外部的上下文被摧毁,但函数内部对闭包的“引用”依然保存,即被引用的对象依旧保持

闭包的优点和缺点:

  • 优点:
    1. 可以从内部函数访问外部函数的作用域中的变量,且访问到的变量长期驻扎在内存中,可供之后使用
    2. 避免变量污染全局
    3. 把变量存到独立的作用域,作为私有成员存在
  • 缺点:
    1. 对内存消耗有负面影响。因内部函数保存了对外部变量的引用,导致无法被垃圾回收,增大内存使用量,所以使用不当会导致内存泄漏
    2. 对处理速度具有负面影响。闭包的层级决定了引用的外部变量在查找时经过的作用域链长度
    3. 可能获取到意外的值(captured value)

使用场景

典型应用是模块封装,在各模块规范出现之前,都是用这样的方式防止变量污染全局。
var Yideng = (function () {
  // 这样声明为模块私有变量,外界无法直接访问
    var foo = 0;
    function Yideng() {}
    Yideng.prototype.bar = function bar() {
        return foo;
    };
    return Yideng;
}());