Javascript - var 有何不同?

Javascript - How is var making a difference?

请参阅以下片段。 第一个错误,这是预期的。 第二个通过。是什么原因,或者两个片段之间的区别。

var myvar = 4,7 //Error

myvar2 = 3,4 //No error

在第一行中,您用逗号分隔声明 (Variable Statement),此处缺少变量名。

第二行使用的是Comma Operator,效果很好,即使不需要。

问题出现了

If second was a comma operator, then the value in myvar2 would be 4. but it is 3!

是因为逗号和等号的Operator Precedence。进行赋值,稍后计算逗号。

第一行基本上是这样翻译的:

var myvar = 4,
7

所以 "second line" 会抛出错误,因为 JavaScript 解释器希望您要分配两个变量但找不到第二个变量的名称。例如,您可以像这样分配变量

var first = 0,
    obj = {},
    s = "my string",
    array = [1,2,3,4,5];

不会出错,因为它是有效的 JavaScript 并且每个值都有一个可以分配给它的变量名。

在第二个示例中,您只分配了最后一个数字 - 没有 var 关键字 JavaScript 不会引发错误,只会分配第一个值。有点像写下面的

myvar = 3
4

所以第一个值被赋值了。我以前把它搞混了(见历史)。当将 myvar = 3,4 传递给控制台时,它看起来像是分配了 4,但它只是打印到控制台中——换句话说,, 后面的部分被评估了。当您将以下内容粘贴到控制台时,您可以看到这一点

myvar = 3, _this_function_doesnt_exist()

此处解析器将抛出错误:Uncaught ReferenceError: _this_function_doesnt_exist is not defined(…) - 之前的表达式 (myvar = 3) 仍在执行,因此 myvar 将为 3.

我曾经只用一个 var 关键字来编写我的所有变量,但发现它相当混乱和丑陋。一般来说,我建议每行使用一个赋值,并在每个变量前使用 var(或者 constlet 等,如果您编写 ECMAScript 2015/ES6)

只是为了进一步扩展 Nina Schloz 答案

 var myvar = 4, 7 // throws Uncaught SyntaxError: Unexpected number

 // Because declared variables are hoisted to the top of the scope,this translates to
 /*
    var myvar;
    var 7; // throws Uncaught SyntaxError: Unexpected number
    myvar = 4; // this never gets executed
 */

 var anotherVar = 4, x; // this doesn't throw an error
 // this translates to
 /*
    var anotherVar;
    var x;
    anotherVar=4;
 */

当我们执行 myvar2=3,4 时,我们使用 comma operator,它首先将 3 分配给 undeclared variable myvar2,然后 returns 表达式的最后一个值(从左到右)是数字 4