JS中的词法作用域

时间:2018-11-05 23:08:45

标签: javascript

我正在读一本书(作者Ethan Brown学习JavaScript)来学习JS,

  

词法作用域意味着您定义范围内的任何变量   来自(而不是调用时)函数的作用域在   功能。考虑以下示例:

const x = 3;

function f() {
  console.log(x); // this will work
  console.log(y); // this will cause a crash
}
const y = 3;
f();

  

当我们定义函数f时,变量x存在,但y不存在。   然后我们声明y并调用f,然后看到x在范围内   调用时为f的主体,但不为y。这是词汇的一个例子   作用域:函数f可以访问以下标识符   在定义时可用,而不是在调用时可用

当我在VS Code调试器中运行它时,似乎没有任何错误。

我知道

  

3

     

3

无任何例外。这可以取决于我使用的ES版本还是其他版本?

2 个答案:

答案 0 :(得分:4)

尽管我认为作者只是选择了一个拙劣的(很好,不正确的)代码来说明这一点,但是代码却很有趣作为说明相关但不同的内容的一种方式。因为y是用const声明的,所以它在函数内部是可见的,因为它的声明被提升到最近的封闭块(在已发布的代码中未明确显示,但必须在某处)。但是,如果将函数调用移到该声明之前的 ,您 将会看到错误,因为对y的引用将发生在名称有点怪异的“时间死区”。使用letconst创建的已声明但未初始化的变量的引用是运行时错误。

如果将y的声明更改为var声明,则将函数调用移至变量声明之前不会导致错误,因为该变量已定义并且在范围内,但是(旧-school)未初始化,因此只需undefined

答案 1 :(得分:3)

之所以有用,是因为在调用const y=3之前声明了f()。如果将y的声明移到f()之后,它将作为“ expected”