let和var在Javascript中的奇怪行为

问题描述 投票:0回答:2

案例1

var a  // ===> undefined
let a  // ===> SyntaxError: Identifier 'a' has already been declared

案例2

a = 1  // ===> 1
var a  // ===> undefined
let a  // ===> undefined

为什么情况2不引发异常?

javascript v8
2个回答
0
投票

情况2由于a = 1不会引发异常。

请记住,let变量在计算其值之前不会初始化。

var相比,与var变量不同,undefinedlet初始化


0
投票

[当您定义不带varletconst的变量时,会将其输入全局范围。试试这个:

在您选择的JS解释器中,执行此操作:

>>> a = 5
>>> global

您将看到一堆数据,在最底部,您将看到a = 5

现在输入

>>> var a = 7
>>> global

您将看到相同的东西,但是现在是7。

重新启动解释器并输入

>>> a = 5
>>> let a = 7
>>> global

您会看到a仍等于5!这给我们一个提示:varlet没有使用相同的范围。重新启动您的解释器。

>>> a = 5
>>> let a = 6
>>> var a = 7  // Syntax Error!

现在,尝试这个:

>>> var b = 6
>>> var b = 7

注意语法没有错误?我们发现,如果在全局级别重新声明全局变量,它们将不会引发语法错误。但是,您不能在全局级别重新声明已经在较低级别声明的变量。 letvar以下的范围内创建一个变量,该变量在全局范围内声明。这就是为什么当您运行两次var时,什么都没有发生,但是当您运行let然后var(或先运行let然后let)时,会出现语法错误。

© www.soinside.com 2019 - 2024. All rights reserved.