Appearance
什么是闭包
先说结论
闭包 = 函数 + 函数能够访问的自由变量
ECMAScript中,闭包指的是:
自由变量
什么是自由变量?
js
var a = 1;
function foo() {
console.log(a);
}
foo();
var a = 1;
function foo() {
console.log(a);
}
foo();
在foo函数中,a变量
既不是foo的参数,也不是foo的局部变量。所以这就是自由变量
总结
- 从理论角度: 所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域。
- 从实践角度: 以下函数才算是闭包:即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)在代码中引用了自由变量