JS 中的脚本作用域

问题描述 投票:0回答:1

我正在浏览 JS 中的词法环境和环境记录/范围。

我知道 var 和 let 之间的区别(部分)(一个是块作用域,一个是函数作用域),而且 let 在被分配任何变量之前位于 TDZ 中。

我执行了以下代码,但现在我有点困惑。

Code Snippet

混乱: 在全局代码中,var a 被分配到 GLOBAL 作用域,因为它是 a var,而 let b 被提升到单独的内存空间(这里是脚本作用域)。所以我们在初始化(TDZ)之前无法访问它。

但是同样的概念,当我在函数中编写它时,我们只有一个作用域,即该函数的本地作用域,那么 JS 如何知道 a1 和 b1 之间的区别?当我运行调试器时,两者都设置为未定义(在创建阶段),并且在执行阶段都设置为 1。就像我们没有像 a 和 b 一样有两个不同的作用域,对吗?

还可以解释一下什么是范围内的脚本(或者至少在我可以看到它的地方给出任何参考)

javascript scope global var let
1个回答
0
投票

所以我执行了你的示例(稍加修改),将调试点放在某些行上。

 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号线:

  • 脚本:b:< value unavailable >
  • 全局:a:未定义

4号线:

  • 脚本:b:20
  • 全球:a:10

7号线:

  • 本地: a1:未定义,b1:< value unavailable >
  • 脚本:b:20
  • 全球:a:10

10号线:

  • 本地:a1:10,b1:20
  • 脚本:b:20
  • 全球:a:10

请注意,var 和 let 变量的提升方式不同,无论其范围如何。关键是,暂时死区并不特定于任何范围。相反,它是变量(使用 let 声明)尚未初始化的区域。

© www.soinside.com 2019 - 2024. All rights reserved.