返回

揭开闭包的真正本质:你可能从未想过的

前端

关于闭包,大多数人都有一个根深蒂固的误解,我敢说在座的大多数人都错了。闭包并非一个晦涩难懂的概念,而是可以从一个独特的视角清晰理解的。

闭包的本质,在于它可以访问创建它的函数的局部变量,即使该函数已经执行完毕。就好比一个函数内部的秘密房间,即使函数的大门关闭了,我们仍然可以通过闭包这扇暗门进入。

要理解这一点,我们不妨举一个例子。假设我们有一个函数,负责计算一个数字的平方:

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 中是一个非常有用的特性,可以用于创建持久状态、实现模块化和增强代码的可重用性。

因此,当我们谈论闭包时,我们并不是说它是一些神秘莫测的东西。闭包的本质很简单:它是一种访问函数局部变量的机制,即使该函数已经执行完毕。