我尝试在控制台中逐行编写以下几行
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
现在的问题是,如何未定义和同时声明。两者之间有什么区别。
答案 0 :(得分:5)
let
或const
变量只能被声明一次-也就是说,当您在范围中拥有let <variableName>
时,您已经声明了{{1 }},并且无法在该范围内再次声明。
进行分配时,将首先解析右侧;如果右侧抛出错误,则永远不会到达左侧,并且用let声明的变量永远不会正确初始化;它将永远停留在非军事区/暂时死亡区
即使初始化期间尝试进行的分配引发错误,您也不能重新声明已经声明的变量。
但是在第4行,x = 3应该做适当的赋值,并且应该从TDZ中删除x。但这也失败了。我不明白
在变量被初始化(例如,运行<variableName>
之后),可以将其分配给它。但是就像您无法在变量{em>之前初始化let x
一样,也无法在变量初始化未成功完成后再分配变量:
let
错误:
未捕获的ReferenceError:x未定义
您尝试在控制台中发生的事情与之相同:
x = 'foo';
let x = 'bar';
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
仍未初始化,因此错误相同。
遇到这种事情是很奇怪的-您只能在控制台中看到它。在普通脚本中,抛出错误将阻止进一步执行,并且不必担心变量名永远不会被初始化的事实。