对于闭包的理解
何为闭包
一个函数和对其周围状态的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域。在 JavaScript 中,每当创建一个函数,闭包就会在函数创建的同时被创建出来。
作用域
function outer () {
const outerName = "is Outer var"; // outerName 是一个被 outer 创建的局部变量
function inner () { // inner() 是outer内部的函数,一个闭包
alert(outerName); // 使用了父函数中声明的变量
}
inner();
}
outer();
拷贝这段代码到浏览器控制台,发现会弹出outerName的内容。以上写法很常见。inner() 没有自己的局部变量。然而,因为它可以访问到外部函数的变量,所以 inner() 可以使用父函数 outer() 中声明的变量 outerName 。嵌套函数可访问声明于它们外部作用域的变量。
再看一段例子
闭包
function outer() {
const outerName = "is Outer var2";
function inner() {
alert(outerName);
}
return inner;
}
const myFn = outer();
myFn();
运行这段代码效果和之前那段代码效果完成一样,也开业弹出outerName的内容。我们发现不同点在于。outer方法会返回inner方法,
调用myFn时还是可以访问到outer作用域块内的outerName这就是闭包。
闭包私有方法
再看一段例子
function outer() {
let outerName = "is Outer var";
function inner(arg) {
outerName = outerName + arg
console.log(outerName)
}
return inner;
}
const myFn1 = outer();
myFn1(100)
const myFn2 = outer();
myFn2(200)
// is Outer var100
// is Outer var200
运行代码。发现 myFn1 和 myFn2 运行时、各自调用 inner 中的 outerName是相互独立的,每个闭包都是引用自己词法作用域内的变量 outerName。

浙公网安备 33010602011771号