声明的变量和定义的变量之间是否有区别

Mah*_*Ali 6 javascript variables

我尝试在控制台中一一写入以下行

let x = y //throws error "Uncaught ReferenceError: y is not defined"
console.log(x) //throws error "ReferenceError: x is not defined"
let x = 3; //gives error "Uncaught SyntaxError: Identifier 'x' has already been declared"
x = 3 //ReferenceError: x is not defined
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如何不能定义变量并同时对其进行声明。两者之间有什么区别。

Cer*_*nce 5

一个letconst变量只能申报一次-也就是说,当你let <variableName>在一个范围内,你已经宣布<variableName>在该范围内,并且不能在该范围再次声明。

先前链接的问题

进行分配后,将首先解析右侧。如果右侧抛出错误,则永远不会到达左侧,并且用let声明的变量永远不会正确初始化;它将永远留在非军事区/暂时的死区

即使初始化期间尝试进行的分配引发错误,也无法重新声明已经声明的变量。

但是在第4行,x = 3应该做适当的分配,并且应该从TDZ中删除x。但这也失败了。我不明白

变量初始化后(例如,let x运行),可以将其分配给它。但就像你不能分配给一个变量之前它的let初始化,你也不能分配给一个变量后,当它的初始化没有成功完成:

x = 'foo';
let x = 'bar';
Run Code Online (Sandbox Code Playgroud)

错误:

未捕获的ReferenceError:x未定义

尝试时,这与控制台中发生的事情相同:

let x = y
// Uncaught ReferenceError: y is not defined
// x has not been initialized, so the next line throws:
x = 'foo'
// Uncaught ReferenceError: x is not defined
Run Code Online (Sandbox Code Playgroud)

x 仍未初始化,因此错误是相同的。

但是,遇到这种情况很奇怪 -您只能在控制台中看到它。在普通脚本中,抛出错误将阻止进一步执行,并且不必担心变量名永远不会被初始化的事实。