Skip to content

什么是闭包

先说结论

闭包 = 函数 + 函数能够访问的自由变量

ECMAScript中,闭包指的是:

自由变量

什么是自由变量?

js
var a = 1;

function foo() {
    console.log(a);
}

foo();
var a = 1;

function foo() {
    console.log(a);
}

foo();

在foo函数中,a变量既不是foo的参数,也不是foo的局部变量。所以这就是自由变量

总结

  • 从理论角度: 所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域。
  • 从实践角度: 以下函数才算是闭包:即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)在代码中引用了自由变量