我正在读一本书(作者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版本还是其他版本?
答案 0 :(得分:4)
尽管我认为作者只是选择了一个拙劣的(很好,不正确的)代码来说明这一点,但是代码却很有趣作为说明相关但不同的内容的一种方式。因为y
是用const
声明的,所以它在函数内部是可见的,因为它的声明被提升到最近的封闭块(在已发布的代码中未明确显示,但必须在某处)。但是,如果将函数调用移到该声明之前的 ,您 将会看到错误,因为对y
的引用将发生在名称有点怪异的“时间死区”。使用let
或const
创建的已声明但未初始化的变量的引用是运行时错误。
如果将y
的声明更改为var
声明,则将函数调用移至变量声明之前不会导致错误,因为该变量已定义并且在范围内,但是(旧-school)未初始化,因此只需undefined
。
答案 1 :(得分:3)
之所以有用,是因为在调用const y=3
之前声明了f()
。如果将y
的声明移到f()
之后,它将作为“ expected”