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

时间:2019-03-04 09:09:17

标签: 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

现在的问题是,如何未定义同时声明。两者之间有什么区别。

1 个答案:

答案 0 :(得分:5)

letconst变量只能被声明一次-也就是说,当您在范围中拥有let <variableName>时,您已经声明了{{1 }},并且无法在该范围内再次声明。

来自previously linked question

  

进行分配时,将首先解析右侧;如果右侧抛出错误,则永远不会到达左侧,并且用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 仍未初始化,因此错误相同。

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