返回

剖析JavaScript秘籍之第五章:揭秘闭包与作用域的奥秘

前端

揭秘闭包的精妙

闭包,如同一个幽灵,无形却又真实地存在。当函数执行完毕,这个函数里定义的变量通常会被回收,但闭包内的函数却能够访问这些变量,好像这些变量永不消逝。

举个栗子,下面这组代码可以帮助你理解闭包的奥妙:

function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

const add5 = makeAdder(5);
const add10 = makeAdder(10);

console.log(add5(2)); // 7
console.log(add10(2)); // 12

在这个代码片段中,makeAdder 函数接受一个参数 x,并返回一个闭包函数。这个闭包函数又接受一个参数 y,并返回 x + y 的值。

当我们调用 makeAdder 函数并把它赋给 add5add10 时,add5add10 都拥有一个闭包函数。add5 闭包函数中的 x 被设置为 5add10 闭包函数中的 x 被设置为 10

然后,我们可以调用 add5add10 来分别计算 5 + 210 + 2 的值。

这就是闭包的妙用之处。闭包函数可以访问其创建函数中定义的变量,即使这些变量在闭包函数创建后已经被销毁。

窥探作用域的奥秘

作用域决定了变量的有效范围,它可以帮助我们更好地组织代码,防止变量冲突。作用域分为全局作用域和局部作用域。

全局作用域是整个程序都可以访问的,局部作用域只在函数或块中有效。

在 JavaScript 中,函数具有自己的作用域,函数内部定义的变量只能在该函数内使用。如果函数内部使用了全局变量,则该全局变量对函数内部是可见的。

作用域链是作用域的一种特殊机制,它决定了变量的查找顺序。当 JavaScript 引擎在运行时需要查找一个变量时,它会从当前作用域开始,沿着作用域链向上查找,直到找到该变量为止。

携手共舞,共赴精彩

作用域和闭包是 JavaScript 中非常重要的概念,理解它们对于编写出高效、易读的代码至关重要。

闭包可以帮助我们创建私有变量,封装数据,提高代码的可维护性。作用域可以帮助我们更好地组织代码,防止变量冲突,提高代码的可读性。

只有当你能够熟练掌握闭包和作用域,你才能真正成为一名 JavaScript 高手。

延伸思考

  1. 闭包是否会造成内存泄漏?
  2. 如何避免闭包造成内存泄漏?
  3. 作用域链是如何工作的?
  4. 如何在代码中合理地使用闭包和作用域?

我希望这篇文章能够帮助你更好地理解 JavaScript 中的闭包和作用域。如果您有其他疑问或建议,请随时告诉我。