闭包是什么:闭包是指那些能够访问自由变量的函数。
1. 从理论角度
所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域。
2. 从实践角度:以下函数才算是闭包:
1. 即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)
2. 在代码中引用了自由变量
我们一般接触的函数或者我们理解的闭包是:A函数包含B函数,并返回了B函数,并且B函数引用了A函数中的变量。
function checkScope() {
var scope = "local scope";
function f() {
return scope;
}
return f;
}
var foo = checkScope();
console.log(foo());
以上代码输入 local scope ,因为作用域链以及函数中的变量的关系,执行f函数查找的是f的作用域链checkScope中的变量的scope。所以输出的“local scope”这个字段。