乐闻世界logo
搜索文章和话题

JS 的闭包是如何工作的?

5 个月前提问
1 个月前修改
浏览次数8

1个答案

1

在 JavaScript 中,闭包是一个非常强大的特性。闭包是函数和声明该函数的词法环境的组合。这个词法环境包含了闭包创建时在作用域中的所有局部变量。

闭包的工作原理是这样的:

  1. 在 JavaScript 中,函数可以嵌套。 当一个函数(我们称之为“外部函数”)中定义另一个函数(“内部函数”或“闭包”),内部函数可以访问外部函数作用域中的变量。这种行为是基于 JavaScript 的词法作用域规则的,即函数的作用域在函数定义时就确定了,而不是在函数调用时。
  2. 内部函数记住了其词法作用域。 即使外部函数的执行已经结束,内部函数仍然可以访问外部函数作用域中的变量。这是因为内部函数保持对这些变量的引用,这就是闭包的本质。
  3. 闭包使得私有变量成为可能。 在许多面向对象的语言中,对象可以有私有变量。JavaScript 原生不支持私有变量,但通过闭包可以实现类似的功能。这些变量对外部代码是不可见的,只能通过闭包提供的功能来访问,这样就可以控制对这些变量的访问。

让我举一个简单的例子来展示闭包的工作原理:

javascript
function createCounter() { let count = 0; // 这是一个私有变量,只能通过下面的函数访问 return { increment: function() { count++; return count; }, decrement: function() { count--; return count; } }; } const counter = createCounter(); console.log(counter.increment()); // 输出 1 console.log(counter.increment()); // 输出 2 console.log(counter.decrement()); // 输出 1

在这个例子中,createCounter 函数返回一个包含两个方法的对象(incrementdecrement)。这两个方法都在同一个词法作用域中,即 createCounter 函数的作用域。因此,它们都可以访问 count 变量,即使在 createCounter 函数执行完毕后。其他无法访问 count 变量,因为它不是全局的,也不是返回对象的属性,它只存在于 createCounter 的词法作用域中。

由于这个特性,闭包在很多设计模式和技术中都非常有用,比如在模块模式、防抖和节流函数、以及创建能够保持状态的函数等场景中。

2024年6月29日 12:07 回复

你的答案