什么是闭包
闭包是指那些能访问自由变量(在函数中使用的既不是函数局部的变量,又不是函数参数的变量)的函数
闭包 = 函数 + 自由变量
ECMAScript中,闭包指的是:
从理论角度:所有的函数。因为它们都在创建的时候就将上层上下文的数据保存起来了。哪怕是简单的全局变量也是如此,因为函数中访问全局变量就相当于是在访问自由变量,这个时候使用最外层的作用域。 从实践角度:以下函数才算是闭包:
- 即使创建它的上下文已经销毁,它仍然存在(比如,内部函数从父函数中返回)
-
在代码中引用了自由变量
在MDN的解释中,闭包是一个函数以及其捆绑的周边环境状态的引用的组合。闭包让开发者可以从内部函数访问外部函数的作用域
代码示例
function init() {
const name = 'chinley';
function displayName() {
alert(name);
}
displayName();
}
init();
init创建了一个局部变量name和一个名为displayName的函数。displayName是定义在init里的内部函数,并且仅在init函数体内可用。displayName没有自己的局部变量,但它可以访问到外部函数的变量, 所以displayName可以使用init中声明的变量name。
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
var foo = checkscope();
foo();
f函数执行的时候,尽管checkscope的执行上下文已经从执行上下文栈中弹出,checkscopeContext被销毁了,但f函数的执行上下文维护的作用域还是记录了checkscope的活动变量 fStack = [VO, checkscopeContext.VO, globalContext.VO]
function addNum(x) {
return (y) => x+y;
}
const add5 = addNum(5);
add5(10); // 15
闭包的作用
- 用闭包模拟私有方法
- 可以读取到函数内部的变量
- 让变量始终保存在内存中