【发布时间】:2020-09-24 19:53:12
【问题描述】:
有人能解释一下在尝试访问variable before the let declaration: "let X" 时出现在chrome and firefox 中的奇怪错误消息吗?如果我们这样写:
console.log(X);
let X;
/*
In firefox it reports an error like:
ReferenceError: can't access lexical declaration 'X' before initialization
In chrome it reports and error like:
Uncaught ReferenceError: Cannot access 'X' before initialization
*/
为什么它会返回您在上面的代码中看到的错误消息,而没有给出如下错误消息:
console.log(X);
/* the error message i was expecting:
firefox: ReferenceError: X is not defined
chrome: ReferenceError: X is not defined
*/
这是否意味着 let 变量 hoist 也因为错误消息显示 let variables 的属性被提升意味着 JavaScript 引擎知道我们何时尝试访问 let variable 在声明之前
console.log(X);
let X;
ReferenceError: can't access lexical declaration 'X' before initialization
如果您在ECMAScript specification 中发现与此行为相关的任何内容,请让我知道
【问题讨论】:
-
为什么不吊起来?它是一个变量,就像一个 var。它只是缩小了范围
-
那么为什么人们称之为
let variables从不hoist -
它们的意思是你不能在定义之前使用它们。如您所见:尝试这样做会引发错误。
-
然而,一个恼人的副作用当然是,虽然它们以未分配的形式存在,但它们仍然可以隐藏外部范围的变量。因此,在函数的最后一行添加
let location仍然可以破坏整个函数的先前代码,但至少它会以更有意义的方式这样做。如果您将var location放入函数的最后一行并且您的第一行将完成location = 'http://yahoo.com',那么它会静默 破坏代码,但使用let它会这样做以一种显着的方式。 -
我意识到实际上已经有更好的答案了:What is the temporal dead zone?
标签: javascript variables let hoisting