gpt4 book ai didi

javascript - 全局还是封闭?

转载 作者:行者123 更新时间:2023-11-30 11:10:42 24 4
gpt4 key购买 nike

Console Image

根据我的理解,变量“a”是一个全局变量。但是当我在 Chrome 控制台中检查它时,我发现变量“a”是一个闭包。为什么?

var a = 5;
function abc()
{
var b = 4;
return a*b;
}
console.dir(abc);

最佳答案

tl;dr:每个函数在技术上都是 JavaScript 中的闭包。

全局环境在这方面没有什么特别之处(它在其他方面很特别)。它只是第一个被创建的环境,因此位于每个“环境链”的末端。 IE。在程序运行时创建的每个环境都是在全局/第一/顶级环境“内部”创建的,因此可供所有人使用。

有关环境和功能如何相关的更多信息,请参见下文。


什么是闭包?

闭包是一个可以访问和解析自由变量的函数。这些变量不是函数的参数,也没有在函数本身中定义。
a 在您的示例中是一个自由变量。

函数如何解析 JavaScript 中的自由变量?

您可以将环境/范围想象成将值与标签相关联的表或对象。例如,环境包含

var a = 42;

可能看起来像

+--------+
| a | 42 |
+--------+

现在,当您定义一个函数时,它会获得对创建它的环境(即这个标签->值关联)的引用。环境包含

var a = 42;
function foo(bar) {
console.log(a);
}

看起来像

+--------+                               
|a | 42| +----------------+
|foo | -+---------> FunctionObject |
+--------+ +----------------+
^ |name | "foo" |
| |[[env]] | ---+ -+
| +----------------+ |
| |
+---------------------------------+

现在当 fooexecute 时,一个新的环境被创建,其parent environment 是函数被创建的环境。即当 foo(21) 发生时,我们的状态是:

+-----------------+                      
|bar | 21 |
|[[parent]] | ---+--+
+-----------------+ |
|
+---------------+
|
v
+--------+
|a | 42| +----------------+
|foo | -+---------> FunctionObject |
+--------+ +----------------+
^ |name | "foo" |
| |[[env]] | ---+--+
| +----------------+ |
| |
+---------------------------------+

现在当我们尝试访问 a 时,在当前环境中找不到它,所以我们查看它的父级,它是在哪里定义的。

同样,全局环境在这方面没有什么特别之处。它只是创建的第一个 环境,因此每个函数都有对它的引用(在嵌套函数的情况下直接或间接)。这就是它“全局化”的原因。

关于javascript - 全局还是封闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53862865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com