JavaScript 中的闭包是什么?

2025-05-25

JavaScript 中的闭包是什么?

各位读者大家好,

  • 继续阅读此博客以了解有关闭包的更多信息......
  • 让我们看这个例子:
1. function x(){
2.     var a=14;
3.     function y(){
4.         console.log(a);
5.     }
6.     y();
7. }
8. x();
Enter fullscreen mode Exit fullscreen mode
  • 以上是一个闭包的例子。我们已经知道这个程序的输出,即 a 等于 14,但让我们理解一下这背后的理论。
  • 首先我们需要了解词法作用域(LS)的含义,

图片描述

  • LS 的意思是,当 y() 被调用时,它会尝试在本地内存中查找变量a,但找不到,于是它会去它的词法父级 (Lexical Parent) 中查找变量 a,并因此在控制台中打印出来。这被称为词法作用域 (Lexical Scoping)。
  • 函数与其词法环境捆绑在一起形成闭包。这里,函数 y 被捆绑到 x 的变量上。
  • 所以从某种意义上来说,这就是闭包!!!

深入探讨闭包

  • 考虑以下示例:
1. function x(){
2.     var a=14;
3.     function y(){
4.         console.log(a);
5.     }
6.     return y;
7. }
8. var z=x();
9. z();
Enter fullscreen mode Exit fullscreen mode
  • 上述程序的输出是什么?
  • 答案是当第 9 行调用 z() 返回 14 时,但这怎么可能呢???
  • 我们知道JS 是同步的,即运行第 8 行后,x 被删除,即 X()执行上下文(EC)在调用堆栈中被删除
  • 要了解有关 EC 的更多信息,请阅读我的 EC 博客
  • 在上面的例子中,“ a ”不在全局范围内,并且 x 在第 8 行之后被删除,因此程序控制台如何记录 14。这里闭包就出现了。
  • 当函数从另一个函数返回时,它们仍然保持其词法作用域
  • 当返回 y 时,不仅返回函数代码,还返回了闭包封装的函数及其词法环境,并将其赋值给 z。这就是闭包的用例。
  • 闭包的其他用途:
  1. 柯里化
  2. 设置超时
  3. 记忆等
  • 感谢大家阅读我的博客,祝大家有愉快的一天 :)
文章来源:https://dev.to/naveenkamath/what-are-closures-in-javascript-4gf3
PREV
使用 NextAuth.js 立即向现有的无服务器 Next.js 应用程序添加身份验证!
NEXT
Package.json 文件解释!!!