JavaScript变量定义:逗号与分号

Col*_*ein 83 javascript variables

在声明一组变量而不是分号时使用逗号有什么区别和/或优点(如果有的话).

例如:

var foo = 'bar', bar = 'foo';
Run Code Online (Sandbox Code Playgroud)

var foo = 'bar';
var bar = 'foo';
Run Code Online (Sandbox Code Playgroud)

我知道如果你var在第一个例子中的第一个变量上指定关键字,它会持久化所有变量,因此它们都会产生与范围相同的最终结果.这只是个人偏好,还是以任何方式做到这都有性能优势?

Ode*_*ded 69

没有性能优势,仅仅是个人选择和风格.

第一个版本更简洁.


更新:

就通过网络传输的数据量而言,当然越少越好,但是var为了看到真正的影响,你需要大量的删除声明.

有人提到缩小是第一个例子有助于更好地缩小的东西,然而,正如Daniel Vassallo在评论中指出的那样,一个好的缩小器会自动为你做这件事,所以在这方面没有任何影响.

  • 缩小您的JavaScript时有一个性能优势. (7认同)
  • @Ryan:好的缩小器,比如Google Closure Compiler会将多个var语句合并为一个:http://img840.imageshack.us/img840/3601/closurecompilerservice.jpg (7认同)
  • @Oded - 缩小与性能问题一致.因此,如果一种风格适合于更好的缩小,那么它就会间接地影响性能问题 (2认同)
  • 是的,你是对的.出于好奇,我创建了一个测试(http://jsperf.com/var-declarations-multiple-vs-single-and-top-vs-all-over),运行了5次,得到了5个不同的答案.所以,嗯,是的,这完全取决于风格和个人偏好,而不是表现. (2认同)

Fel*_*lix 26

在读完Crockford和其他人之后,我开始用逗号将变量链接起来.然后,我真的对Chrome DevTools调试器感到恼火,它不会停止使用逗号定义变量.对于调试器,使用逗号链接的变量定义是单个语句,而多个var语句是调试器可以停止的多个语句.因此,我改回:

var a = doSomethingA,
    b = doSomethignB,
    c = doSomethingC;
Run Code Online (Sandbox Code Playgroud)

至:

var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现第二个变体更清晰,更不用说它解决调试器问题的优势了.

"通过电线的代码较少"这一论点并不具有说服力,因为有缩小器.

  • 第二个变体也使得git历史更清晰.在添加另一个变量或冒险创建全局变量之前,不必将尾随分号更改为逗号,只需添加完整的var语句即可. (7认同)

Mar*_*eis 16

我更喜欢这种var-per-variable符号:

var a = 2
var b = 3
Run Code Online (Sandbox Code Playgroud)

因为其他comma-instead-of-another-var符号有这三个缺点:

1.难以维护
请考虑以下代码:

var a = 1,
    b = mogrify(2),
    c = 3
Run Code Online (Sandbox Code Playgroud)

但是,嘿,mogrify做了什么?让我们打印b来找出:

var a = 1,
    b = mogrify(2),
    console.log(b)
    c = 3
Run Code Online (Sandbox Code Playgroud)

打破东西

2.难以阅读

线路乞讨中的变量清楚地表明将启动一个新变量.

var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
        unicorn.legs.map((leg) => {
            leg.log('yes')
        })
    }).sort(),
    c = 3
Run Code Online (Sandbox Code Playgroud)

那到底在c = 3做什么呢?

3.不一致

考虑一下:

var a = 1,
    b = 2,
    c = 3
Run Code Online (Sandbox Code Playgroud)

随着var-per-variable每一个声明遵循相同的结构.随着comma-instead-of-another-var第一个变量比其他不同的方式申报.如果您决定在for循环中移动第一个变量,则必须在声明的中间添加var

除了偏好之外,似乎大多数值得注意的项目都使用var-per-variable符号


Dan*_*llo 7

我同意其他的回答者,这主要是个人风格的问题.但是为了在讨论中引入"权威"意见,Douglas Crockford 在流行的JSLint工具网站上说道:

但是因为JavaScript没有块范围,所以在函数顶部声明所有函数的变量是明智的.建议每个函数使用一个var语句.这可以通过onevar选项强制执行.

  • 值得注意的是,Mozilla Javascript(通过`let`构造)*确实*具有块范围. (6认同)
  • @BlackVegetable`let`不仅可以用于Mozilla JS([见这里](http://caniuse.com/#feat=let)).它是[ES6规范的一部分](http://www.ecma-international.org/ecma-262/6.0/#sec-let-and-const-declarations),但大多数浏览器仍在努力实现ES6. (3认同)