var var1 = 1,
    var2 = 1,
    var3 = 1;

这等价于:

var var1 = var2 = var3 = 1;

我很确定这是变量定义的顺序:var3, var2, var1,这相当于:

var var3 = 1, var2 = var3, var1 = var2;

有什么方法可以在JavaScript中确认这一点吗?可能使用一些分析器?


当前回答

var var var1 = 1, var2 = 1, var3 = 1;

在本例中,var关键字适用于所有三个变量。

var var1 = 1,
    var2 = 1,
    var3 = 1;

这并不等同于:

var var1 = var2 = var3 = 1;

在这种情况下,在屏幕后面,var关键字仅适用于var1,因为变量提升,表达式的其余部分正常计算,因此变量var2, var3将成为全局变量

Javascript对这段代码的处理顺序如下:

/*
var1 is local to the particular scope because of var keyword
var2 and var3 will become globals because they are used without var keyword
*/

var var1;   //only variable declarations will be hoisted.

var1 = var2 = var3 = 1; 

其他回答

试试这个:

var var1=42;
var var2;

alert(var2 = var1); //show result of assignment expression is assigned value
alert(var2); // show assignment did occur.

注意第一个警告中的单个'='。这将显示赋值表达式的结果是赋值,而第二个警报将显示确实发生了赋值。

从逻辑上讲,赋值必须从右到左链接。然而,由于这对javascript来说都是原子的(没有线程),特定的引擎可能会选择稍微不同的优化方式。

var var var1 = 1, var2 = 1, var3 = 1;

在本例中,var关键字适用于所有三个变量。

var var1 = 1,
    var2 = 1,
    var3 = 1;

这并不等同于:

var var1 = var2 = var3 = 1;

在这种情况下,在屏幕后面,var关键字仅适用于var1,因为变量提升,表达式的其余部分正常计算,因此变量var2, var3将成为全局变量

Javascript对这段代码的处理顺序如下:

/*
var1 is local to the particular scope because of var keyword
var2 and var3 will become globals because they are used without var keyword
*/

var var1;   //only variable declarations will be hoisted.

var1 = var2 = var3 = 1; 

实际上,

var var1 = 1, var2 = 1, var3 = 1;

不等于:

var var1 = var2 = var3 = 1;

区别在于作用域:

函数good() { Var var1 = 1, var2 = 1, var3 = 1; } 函数bad() { Var var1 = var2 = var3 = 1; } 好(); console.log (window.var2);/ /定义 坏的(); console.log (window.var2);/ / 1。Aggh !

实际上这表明赋值是正确结合的。坏例子相当于:

var var1 = (window.var2 = (window.var3 = 1));

现在很明显,它们是不一样的。编码的方法是

var var1, var2, var3
var1 = var2 = var3 = 1

那么let赋值呢?和var完全一样,不要因为块作用域而让let赋值迷惑你。

let var1 = var2 = 1 // here var2 belong to the global scope

我们可以这样做:

let v1, v2, v3
v1 = v2 = v3 = 2

注意:顺便说一下,我不建议使用多个赋值,甚至不建议在同一行中使用多个声明。

证明

let var1 = {set a(a){console.log(1)}}, var2 = {set a(a){console.log(2)}}, var3 = {set a(a){console.log(3)}}; var1.a = var2.a = var3.a = 1