奇怪但工作的var声明语法

时间:2011-12-16 12:10:15

标签: javascript

我经常使用这种语法,但我不明白它为什么会起作用。

var a = 1, b = a + 1;
console.log(b); // 2

如果你声明了var,在用逗号分隔后,b已经看到a评估了吗?那是为什么?

4 个答案:

答案 0 :(得分:4)

这是defined

首先,基本术语的定义:

  

VariableStatement

     

var VariableDeclarationList ;

  

VariableDeclarationList

     

VariableDeclaration

     

VariableDeclarationList VariableDeclaration

适用于您的问题的实际定义是:

  

生产 VariableDeclarationList VariableDeclarationList VariableDeclaration 评估如下:

     
      
  1. 评估 VariableDeclarationList

  2.   
  3. 评估 VariableDeclaration

  4.   

所以在执行#2时,已经评估了#1,你可以在#2中使用它的任何效果。

答案 1 :(得分:3)

这是由于如何在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;

答案 2 :(得分:2)

只是因为a在b之前被初始化了。这个过程从左到右。

答案 3 :(得分:1)

这有点违反直觉但只是认为它与此相同:

var a = 1;
var b = a + 1;

与Python之类的其他语言不同,其中多个赋值对先前的值进行操作(使交换变得更容易)