揭开闭包的真正本质:你可能从未想过的
2023-11-19 11:05:11
关于闭包,大多数人都有一个根深蒂固的误解,我敢说在座的大多数人都错了。闭包并非一个晦涩难懂的概念,而是可以从一个独特的视角清晰理解的。
闭包的本质,在于它可以访问创建它的函数的局部变量,即使该函数已经执行完毕。就好比一个函数内部的秘密房间,即使函数的大门关闭了,我们仍然可以通过闭包这扇暗门进入。
要理解这一点,我们不妨举一个例子。假设我们有一个函数,负责计算一个数字的平方:
function square(num) {
return num * num;
}
我们调用这个函数,并将结果赋给变量 result
:
const result = square(5);
现在,result
变量存储了 25
。然而,如果我们尝试访问函数内部的 num
变量,将会得到什么?
console.log(num); // ReferenceError: num is not defined
函数执行完毕后,其局部变量 num
将被销毁,无法再通过函数本身访问。但是,如果我们通过闭包访问呢?
我们可以创建一个返回函数的函数,该函数内部嵌套了 square
函数:
function createSquareFunction() {
let num = 5; // 闭包变量
return function() {
return num * num;
};
}
这里,createSquareFunction
函数返回了一个闭包函数,该函数可以访问其外部作用域中的 num
变量。即使 createSquareFunction
函数执行完毕,num
变量仍然存在于闭包函数中。
现在,我们调用 createSquareFunction
函数,并将结果赋给变量 squareFunction
:
const squareFunction = createSquareFunction();
然后,我们可以调用 squareFunction
函数,即使 createSquareFunction
函数已经执行完毕,它仍然可以访问 num
变量:
const result = squareFunction(); // 25
这就是闭包的强大之处。它允许函数访问其外部作用域中的变量,即使该函数已经执行完毕。这在 JavaScript 中是一个非常有用的特性,可以用于创建持久状态、实现模块化和增强代码的可重用性。
因此,当我们谈论闭包时,我们并不是说它是一些神秘莫测的东西。闭包的本质很简单:它是一种访问函数局部变量的机制,即使该函数已经执行完毕。