了解闭包之前,我们要简单明白下JS中的作用域,JS中的作用域分为全局作用域和局部作用域。
- 在全局作用域中访问不了局部作用域中的变量
- 在局部作用域可以访问全局作用域中的变量
那如果我们怎么在全局作用域中访问局部作用域中的变量呢?闭包可以帮我们解决这个问题。
简单的说,就是在局部作用域中(函数)返回一个函数,这个函数就是闭包。
function fn() {
let a = 10;
return function g() {
console.log(a); // 10
}
}
let result = fn();
result()
这里在全局作用域中访问到了fn()函数中的a变量的值,主要的原理是在fn()函数返回了一个函数,用一个变量result接收fn()的返回值,因此能访问到函数fn()内a的值。
再次改造上面的代码
function fn() {
let a = 10;
return function g() {
a++;
console.log(a);
}
}
let result = fn();
result() // 11
result() // 12
一般情况下,函数在执行结束后会清理函数中的变量,这是Js的内存处理机制。但因为闭包的存在,使变量a保存在了内存中,多次执行函数会改变变量的a的值。