LeetCode / JavaScript No.02 闭包(closures)

LeetCode / JavaScript No.02 闭包(closures)

🗿🗿🗿本系列文档在 LeetCode 30 天 JavaScript 挑战 完成后可看到题解,本人只转载方便自看

LeetCode 计数器

概述

JavaScript 中,函数具有对在相同作用域以及任何外部作用域中声明的所有变量的引用。这些作用域被称为函数的 「词法环境」。函数与其环境的组合被称为 「闭包」。

闭包示例

JavaScript 中,你可以在其他函数内部声明并返回函数。内部函数可以访问在其上方声明的任何变量。

function createAdder(a) {
  return function add(b) {
    const sum = a + b;
    return sum;
  }
}
const addTo2 = createAdder(2);
addTo2(5); // 7

在示例代码中,内部函数 add 可以访问 a。这允许了外部函数充当新函数的工厂,每个函数都具有不同的行为。

闭包 VS 类

在上面的示例中,createAdder 非常类似于类构造函数。

class Adder {
  constructor(a) {
     this.a = a;
  }

  add(b) {
    const sum = this.a + b;
    return sum;
  }
}
const addTo2 = new Adder(2);
addTo2.add(5); // 7

除了语法上的差异之外,这两个示例在本质上具有相同的目的。它们都允许我们在「构造函数(Constructor)」中传递一些状态,并具有可以访问此状态的「方法 (Method)」。

它们之间一个关键的区别是闭包允许真正的 封装。在类的示例中,没有任何限制阻止我们编写 addTo2.a = 3 ; 并破坏其预期行为。然而,在闭包的示例中,理论上无法访问 a。请注意,截至2022年,使用 前缀语法 的类仍然可以实现真正的封装。

另一个区别是函数在内存中的存储方式。如果创建了许多类的实例,每个实例都存储对 「原型对象」 的单一引用,其中都存储了所有「方法(Method)」。而对于闭包,所有「方法(Method)」都在每次调用外部函数时生成并存储了一个「副本(Copy)」。因此,在同时有多种方法可用的情况下,类可以在性能方面体现更高的效率。

与像 Java 这样的语言不同,使用其他语言编写的代码通常使用函数而不是类。但由于 JavaScript 是一种多范式语言,代码如何编写取决于我们正在处理的具体项目。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值