我正在浏览 JS 中的词法环境和环境记录/范围。
我知道 var 和 let 之间的区别(部分)(一个是块作用域,一个是函数作用域),而且 let 在被分配任何变量之前位于 TDZ 中。
我执行了以下代码,但现在我有点困惑。
混乱: 在全局代码中,var a 被分配到 GLOBAL 作用域,因为它是 a var,而 let b 被提升到单独的内存空间(这里是脚本作用域)。所以我们在初始化(TDZ)之前无法访问它。
但是同样的概念,当我在函数中编写它时,我们只有一个作用域,即该函数的本地作用域,那么 JS 如何知道 a1 和 b1 之间的区别?当我运行调试器时,两者都设置为未定义(在创建阶段),并且在执行阶段都设置为 1。就像我们没有像 a 和 b 一样有两个不同的作用域,对吗?
还可以解释一下什么是范围内的脚本(或者至少在我可以看到它的地方给出任何参考)
所以我执行了你的示例(稍加修改),将调试点放在某些行上。
1 debugger;
2 var a = 10;
3 let b = 20;
4 debugger;
5
6 function foo(){
7 debugger;
8 var a1 = 30;
9 let b1 = 40;
10 debugger;
11 }
12 foo();
下面是调试器在各个调试点停止时的范围状态:
1号线:
4号线:
7号线:
10号线:
请注意,var 和 let 变量的提升方式不同,无论其范围如何。关键是,暂时死区并不特定于任何范围。相反,它是变量(使用 let 声明)尚未初始化的区域。