什么是闭包
- 前沿:在 JS 中,当一段代码使用一个变量时,js引擎会顺着作用域链去查找,函数作用域是由函数声明的位置决定的,所以内部函数总是可以访问其外部函数中声明的变量。
- 闭包:当通过调用一个外部函数返回一个内部函数后,即使该外部函数已经执行结束了,但是当内部函数引用外部函数的变量时,外部函数的变量依然保存在内存中,我们就把这些变量的集合称为闭包。这些变量可以被闭包中的函数访问和修改,形成了一个封闭的作用域。
闭包还可以这样理解:当函数嵌套时,内层函数引用了外层函数作用域下的变量,并且内层函数在全局作用域下可访问时,就形成了闭包。
示例:
1、调用多个闭包:
function cr
eateCounter(){
let i = 0
return function(){
i++
return i
}
}
let increase1 = createCounter()
let increase2 = createCounter()
console.log(increase1()) // 1
console.log(increase1()) // 2
console.log(increase2()) // 1
console.log(increase2()) // 2
通过不同的函数调用创建的闭包是不共享的 。在上述例子中,increase1和increase2是通过两次调用createCounter函数创建的闭包,它们之间没有任何共享的状态。每个闭包都有自己的i变量,并且在每次调用闭包时都会递增独立的i变量。所以它们的结果是独立的,并不相互影响。
2、返回多个函数
function createCounter() {
let count = 0;
function increase() {
count++;
console.log(count);
}
let message = `Count is ${count}`;
function log() {
console.log(message, count);
}
return [increase, log];
}
const [increase, log] = createCounter();
increase(); // 1
increase(); // 2
increase(); // 3
log(); // Count is 0, 3
请注意,在 createCounter() 函数内部,let message = Count is ${count}; 是在返回闭包之前被声明和赋值。因此,message 变量,及其在闭包中的值,仅与函数定义时的环境相关。