案例1
var a // ===> undefined
let a // ===> SyntaxError: Identifier 'a' has already been declared
案例2
a = 1 // ===> 1
var a // ===> undefined
let a // ===> undefined
为什么情况2不引发异常?
情况2由于a = 1
不会引发异常。
请记住,let
变量在计算其值之前不会初始化。
与var
相比,与var
变量不同,undefined
用let
初始化
[当您定义不带var
,let
或const
的变量时,会将其输入全局范围。试试这个:
在您选择的JS解释器中,执行此操作:
>>> a = 5
>>> global
您将看到一堆数据,在最底部,您将看到a = 5
。
现在输入
>>> var a = 7
>>> global
您将看到相同的东西,但是现在是7。
重新启动解释器并输入
>>> a = 5
>>> let a = 7
>>> global
您会看到a
仍等于5!这给我们一个提示:var
和let
没有使用相同的范围。重新启动您的解释器。
>>> a = 5
>>> let a = 6
>>> var a = 7 // Syntax Error!
现在,尝试这个:
>>> var b = 6
>>> var b = 7
注意语法没有错误?我们发现,如果在全局级别重新声明全局变量,它们将不会引发语法错误。但是,您不能在全局级别重新声明已经在较低级别声明的变量。 let
在var
以下的范围内创建一个变量,该变量在全局范围内声明。这就是为什么当您运行两次var
时,什么都没有发生,但是当您运行let
然后var
(或先运行let
然后let
)时,会出现语法错误。