gpt4 book ai didi

javascript - 在通过范围链进一步搜索之前,内部函数是否知道变量在时间死区内?

转载 作者:行者123 更新时间:2023-12-05 03:16:19 25 4
gpt4 key购买 nike

function b() {
function a() {
console.log(x);
}
a();
const x = 10;

}
const x = 20;
b()

如果我正确理解词法范围和执行上下文,当调用函数 a() 时,它应该引用 b 的词法环境。在 a() 执行期间,b() 内部的 x const 位于临时死区内,直到 a 完成执行。但是,a() 难道不应该认识到没有 x 值可供访问(因为它在 TDZ 中),因此它不应该搜索全局词法环境来找到 const x = 20 吗?

在上面的例子中,a() 抛出一个引用错误。

最佳答案

为了解释内部发生的事情,当 b() 被称为一个新的 environment record 时(ER) 被创建。从概念上讲,“ER”代表一个“作用域”,负责保存在 b 函数中创建的绑定(bind)(变量)。 ER 可以在其中创建一个绑定(bind),但没有与之关联的值,因此可以实例化一个绑定(bind),但不能将其初始化为一个值(因此,绑定(bind)位于 TDZ 中)。在 b 的情况下,x 的单元化绑定(bind)是在b 的 ER 之前创建的b 中的代码已经实际运行。只有当 b() 中的代码开始运行并且我们到达 const x = 10; 行时,x 绑定(bind)才会初始化为一个值。这意味着即使您在评估行 const x = 10; 之前调用 a()x 绑定(bind)已经被创建,只是没有值(这就是 x 被“提升”的原因)

当您尝试从 a 中访问 x 时,首先检查 a 的范围(即:它的 ER)是否有 x。由于 x 没有在 a 中定义,我们沿着作用域链向上移动到周围的作用域来搜索 x。由于周围范围是 b 的范围,因此检查 b 的 ER 是否有 x 绑定(bind),如上所述,它有。这就是为什么我们在检查 b 的范围时停止搜索范围链,因为我们已经找到了 x 的绑定(bind),因此我们从不检查全局范围它的 x 绑定(bind)。但是,由于我们在 b 的 ER 中找到的 x 的绑定(bind)没有值并且未初始化,因此 JavaScript 将抛出 ReferenceError。

关于javascript - 在通过范围链进一步搜索之前,内部函数是否知道变量在时间死区内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74711485/

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