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:这就是它的本质;它的计算顺序与源代码相同,从左到右,从上到下。