- 闭包概念
- 理解闭包
- 闭包作用
闭包:
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。闭包就是间接访问变量或者隐藏变量。
区分作用域是理解闭包的重中之重
function fun() {
let a = 10;
console.log(a);//10
}
fun();
console.log(a)//a is not defined
现在我们在函数外部拿不到变量a怎么办?但是我就想得到它。
function fun() {
let a = 10;
function foo() {
console.log(a)//10
}
foo();
}
fun();
经过验证,foo可以拿到fun内的变量。也就是说由于作用域,foo内会进行RHS查询,拿到上层作用域中的变量。
再把foo函数当作返回值就可以在fun外部访问它的函数变量了。那这就是闭包了。
一个作用域使用了另一个作用域的变量,就产生了闭包。
闭包作用:
- 访问函数局部变量。
- 让变量保存在内存中。
- 声明私有变量。
第一个作用在上方实例中已经提过,我们来看为啥能让变量保存在内存中。
function fun() {
let a = 10;
return () => {
return a++;
}
}
let foo = fun();
console.log(foo());//10
console.log(foo());//11
console.log(foo());//12
不难看出,在执行完第一次后并没有立即回收,而是保存在了内存中。
这是因为匿名函数在全局作用域,而匿名函数的存在必须有fun函数,因此fun始终在内存中。