JavaScript 中的闭包是什么?
各位读者大家好,
- 继续阅读此博客以了解有关闭包的更多信息......
- 让我们看这个例子:
1. function x(){
2. var a=14;
3. function y(){
4. console.log(a);
5. }
6. y();
7. }
8. x();
- 以上是一个闭包的例子。我们已经知道这个程序的输出,即 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();
- 上述程序的输出是什么?
- 答案是当第 9 行调用 z() 返回 14 时,但这怎么可能呢???
- 我们知道JS 是同步的,即运行第 8 行后,x 被删除,即 X()执行上下文(EC)在调用堆栈中被删除。
- 要了解有关 EC 的更多信息,请阅读我的 EC 博客
- 在上面的例子中,“ a ”不在全局范围内,并且 x 在第 8 行之后被删除,因此程序控制台如何记录 14。这里闭包就出现了。
- 当函数从另一个函数返回时,它们仍然保持其词法作用域。
- 当返回 y 时,不仅返回函数代码,还返回了闭包封装的函数及其词法环境,并将其赋值给 z。这就是闭包的用例。
- 闭包的其他用途:
- 柯里化
- 设置超时
- 记忆等
- 感谢大家阅读我的博客,祝大家有愉快的一天 :)