Javascript 带有公共的顶级var语句与带有逗号的赋值语句:为什么它们不同

Javascript 带有公共的顶级var语句与带有逗号的赋值语句:为什么它们不同,javascript,language-lawyer,Javascript,Language Lawyer,我在浏览器控制台中执行这两条语句。但是它们会产生不同的结果/有不同的副作用。我想知道具体的原因 var a = 1,b; #success value of b is undefined a = 1,b; #failure 因为逗号在这里有不同的意思。在第一条语句中,它分隔(使用单个var关键字): 在第二个语句中,它是一个分隔两个表达式的表达式: (a = 1), b; /* ^ ^ Reference Error | declared above */ 因为逗号在这里有不

我在浏览器控制台中执行这两条语句。但是它们会产生不同的结果/有不同的副作用。我想知道具体的原因

var a = 1,b; #success value of b is undefined
a = 1,b; #failure

因为逗号在这里有不同的意思。在第一条语句中,它分隔(使用单个
var
关键字):

在第二个语句中,它是一个分隔两个表达式的表达式:

(a = 1), b; /*
 ^       ^ Reference Error
 | declared above */

因为逗号在这里有不同的意思。在第一条语句中,它分隔(使用单个
var
关键字):

在第二个语句中,它是一个分隔两个表达式的表达式:

(a = 1), b; /*
 ^       ^ Reference Error
 | declared above */
这是预期的行为。
var a=1,b相当于

var a = 1;
var b;
a = 1;
b;
a=1,b相当于

var a = 1;
var b;
a = 1;
b;
b不是有效的JS表达式。
UPD:前面的陈述是不正确的<代码>b是对未定义变量的引用

使用变量声明而不使用
var
关键字的原因是什么?它将在严格模式下失败。

这是预期的行为。
var a=1,b相当于

var a = 1;
var b;
a = 1;
b;
a=1,b相当于

var a = 1;
var b;
a = 1;
b;
b不是有效的JS表达式。
UPD:前面的陈述是不正确的<代码>b是对未定义变量的引用


使用变量声明而不使用
var
关键字的原因是什么?它将在严格模式下失败。

第二个将
b
分配给
a
,而不是
1
。您确定吗<代码>变量b=3
a=1,b控制台日志(a)将输出
1
。对不起,你说得对,我弄错了优先级。不过,“
b;
不是有效的JS表达式”并不完全正确。(我可以删除我的否决票,一旦你编辑,不幸的是它被锁定)确实b;是一个有效的表达式,但必须先赋值,对吗?我同意你关于
b。这只是对未定义变量的引用。第二个变量将
b
赋值给
a
,而不是
1
。您确定吗<代码>变量b=3
a=1,b控制台日志(a)将输出
1
。对不起,你说得对,我弄错了优先级。不过,“
b;
不是有效的JS表达式”并不完全正确。(我可以删除我的否决票,一旦你编辑,不幸的是它被锁定)确实b;是一个有效的表达式,但必须先赋值,对吗?我同意你关于
b。这只是对未定义变量的引用。在第二条语句中,如果省略了括号(如问题中所述),那么我认为第一个值被分配给了,引擎尝试执行第二个值,因此失败了…感谢您帮助理解这一点,但为什么奥列克桑德下面的答案是错误的。@tjb这是我的答案,但由于某种原因,它被否决了。@tjb哎呀,修正了。赋值的优先级高于逗号。在第二条语句中,如果省略括号(如问题中所述),则我认为第一个值被赋值给了a,引擎尝试执行第二个值,因此失败…感谢您帮助理解这一点,但为什么奥列克桑德下面的答案是错误的。@tjb这是我的答案,但由于某种原因,它被否决了。@tjb哎呀,修正了。赋值比逗号具有更高的优先级。