Skip to content

闭包

0. 代码

function foo() {
  var count = 0;

  debugger; // (1)
  function bar() {
    debugger; // (2)
    count++;
    console.log(count);
  }

  return bar;
}

foo(); // STEP 1:产生闭包

var f = foo(); // STEP 2

f(); // STEP 3

f = null; // STEP 4:闭包死亡

foo()早就执行结束了,但是foo()执行上下文环境还存在与栈中,因此bar()时,count可以查找到。

1

1. 闭包是什么?

  • 存在于 内部函数
  • 一个 对象
  • 对象的 属性 是被引用的外部变量。

2. 产生闭包的条件?

  • 函数嵌套
  • 内部函数引用外部函数的变量
  • 调用外部函数

3. 继续用内部函数

2

4. 闭包的生命周期

  • 产生:内部函数声明时产生 (STEP 1)
  • 销毁:内部函数成为垃圾对象时 (STEP 4)

5. 内存溢出和内存泄漏

  • 函数执行完,局部变量没有释放,占用内存时间变长。
  • 内存溢出:程序运行时,需要内存超过剩余内存,抛出内存溢出错误。
  • 内存泄漏:占用的内存没有及时释放。
    1. 意外的全局变量
    2. 没有及时清理计时器或观察者回调函数
    3. 闭包

6. 思考题1

function fn(n, o) {
  console.log(o);
  return {
    fn: function(m) {
      return fn(m, n)
    }
  }
}

var a = fn(0); a.fn(1); a.fn(2); a.fn(3);
var b = fn(0).fn(1).fn(2).fn(3);
var c = fn(0).fn(1); c.fn(2); c.fn(3);

6. 思考题2

思考一下以下代码产生了闭包吗?

function foo() {
  var count = 0;

  debugger; // (1)
  function bar() {
    count++;
    console.log(count);
  }
}

foo(); // STEP 1:产生闭包吗?