var声明语法很奇怪,但可以正常工作

Weird but working var declaration syntax

本文关键字:常工作 工作 但可以 语法 声明 var      更新时间:2023-09-26

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

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

如果你声明一个变量,在逗号上分开它们后,b已经看到a被评估了吗?为什么呢?

已经这样定义了。

首先,基本术语的定义:

VariableStatement :

var VariableDeclarationList ;

:

VariableDeclarationList :

VariableDeclaration

VariableDeclarationListVariableDeclaration

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

生成VariableDeclarationList:VariableDeclarationListVariableDeclaration按如下方式求值:

    <
  1. 评估em> VariableDeclarationList 。

  2. <
  3. 评估em> VariableDeclaration 。

所以在#2执行的时候,#1已经被求值了你可以在#2中使用它的任何效果

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

因为a在b之前被初始化,这个过程从左到右进行

这有点违反直觉,但只要把它想象成等于这个:

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

不像其他语言,如Python,多个赋值操作前一个值(使交换更容易)