Javascript 奇怪但有效的var声明语法
我经常使用这种语法,但我不明白为什么它这么简单Javascript 奇怪但有效的var声明语法,javascript,Javascript,我经常使用这种语法,但我不明白为什么它这么简单 var a = 1, b = a + 1; console.log(b); // 2 如果您要声明一个var,在用逗号拆分它们之后,b已经将a视为已评估的变量了?为什么会这样?仅仅是因为a在b之前被初始化。这个过程从左到右。一直如此 首先,基本术语的定义: 可变语句: varVariableDeclarationList 以及: VariableDeclarationList: 可变声明 VariableDeclarationList,Varia
var a = 1, b = a + 1;
console.log(b); // 2
如果您要声明一个var,在用逗号拆分它们之后,
b
已经将a
视为已评估的变量了?为什么会这样?仅仅是因为a在b之前被初始化。这个过程从左到右。一直如此
首先,基本术语的定义:
可变语句:
var
VariableDeclarationList代码>
以及:
VariableDeclarationList:
可变声明
VariableDeclarationList,VariableDeclaration
适用于您的问题的实际定义如下:
生产VariableDeclarationList:VariableDeclarationList,VariableDeclaration的计算如下:
计算VariableDeclarationList
计算变量声明
因此,在执行#2时,已经对#1进行了评估,您可以在#2中使用它的任何效果。这有点违反直觉,但只要认为它等于:
var a = 1;
var b = a + 1;
与Python等其他语言不同,Python中的多个赋值操作在前面的值上(使交换更容易)这是由于JavaScript中变量的声明方式。Javascript中的变量声明分两步进行。首先,初始化当前范围中声明的所有变量,并给出未定义的值,然后以这种方式声明所有变量,然后给出它们的实际值。因此,您的代码:
var a = 1, b = a + 1;
翻译为:
var a = undefined;
var b = undefined;
a = 1;
b = a + 1;
这叫做吊装。因为您声明的所有变量都挂起在作用域的顶部。这让你可以做一些奇怪的事情,比如:
var a = b; // b = undefined
var b = 0;
当我第一次看到这个时,我认为它就像scheme的let*
。在方案中,示例将是(let*((a1)(b(+a1)))b)
,其扩展为(let((a1))(let((b(+a1)))b)
。就像但有更多的嵌套。我不认为这很奇怪:在我看来,它应该从左到右依次评估每个项目似乎是合乎逻辑的。@nnnnnn:这就是它的本质;它的计算顺序与源代码相同,从左到右,从上到下。