例如:
var foo = 'bar', bar = 'foo';
对比
var foo = 'bar';
var bar = 'foo';
我知道如果在第一个示例的第一个变量上指定 var
关键字,它会持续存在于所有变量中,因此它们在作用域方面都会产生相同的最终结果。这只是个人偏好,还是以任何方式执行时都有性能优势?
var foo = 'bar', bar = 'foo';
对比
var foo = 'bar';
var bar = 'foo';
我知道如果在第一个示例的第一个变量上指定 var
关键字,它会持续存在于所有变量中,因此它们在作用域方面都会产生相同的最终结果。这只是个人偏好,还是以任何方式执行时都有性能优势?
这并不会带来性能上的好处,只是个人选择和风格问题。
第一个版本更加简洁。
更新:
当然,从传输数据量的角度考虑,少一些是更好的,但你需要去掉大量 var
声明才能看到实际影响。
代码压缩 被提及为第一个示例可以帮助更好地进行代码压缩,但正如 Daniel Vassallo 在评论中指出的那样,一个好的代码压缩工具将自动为您完成,因此在这方面没有任何影响。
在阅读了Crockford和其他资料后,我开始只使用逗号来链接我的变量。然后后来,我真的对Chrome DevTools调试器感到很恼火,它不会停在使用逗号定义变量的位置上。对于调试器来说,使用逗号链接的变量定义是一个语句,而多个var语句则是多个语句,调试器可以在这些语句处停止。因此,我又从逗号链接回到了:
var a = doSomethingA,
b = doSomethignB,
c = doSomethingC;
收件人:
var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;
到目前为止,我认为第二个变体更加简洁,更不用说它解决了调试器问题的优势。
“通过网络发送少量代码”这一论点并不具有说服力,因为有压缩工具存在。
debugger
,再添加另一个var
并继续使用逗号链接它们。然后当我完成调试后,我会回去删除debugger
和额外的var
。 - Collin Klopfenstein我更喜欢使用每个变量一个 var
的写法:
var a = 2
var b = 3
因为其他使用逗号代替另一个变量的符号表示法有以下三个缺点:
1. 难以维护
考虑以下代码:
var a = 1,
b = mogrify(2),
c = 3
不过,嘿,mogrify是做什么用的呢?让我们打印变量b来找出答案:
var a = 1,
b = mogrify(2),
console.log(b)
c = 3
破坏事物
2. 阅读困难
在行首的 var 清晰地表明将会初始化新变量。
var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
unicorn.legs.map((leg) => {
leg.log('yes')
})
}).sort(),
c = 3
这个 c = 3 是什么鬼?
3. 不一致
考虑以下内容:
var a = 1,
b = 2,
c = 3
使用 var-per-variable
每个声明都遵循相同的结构。 使用 comma-instead-of-another-var
第一个变量的声明方式与其他变量不同。 如果您决定将第一个变量移动到 for 循环内部,您将不得不在声明中间添加 var。
除了个人喜好外,似乎大多数知名项目都使用 var-per-variable
符号。
我同意其他回答者的观点,这主要是个人风格问题。但为了引入一种“权威”的观点,以下是道格拉斯·克罗克福德在流行的JSLint工具网站上的说法:
但由于JavaScript没有块级作用域,最好将函数所有变量声明放在函数顶部。建议每个函数只使用一个var语句。可以使用
onevar
选项来强制执行此操作。
let
语法)确实具有块级作用域。 - BlackVegetablevar
。因此,如果使用 JSLint 检查代码(在我看来不是坏主意),你将更多地使用前一种格式而不是后一种格式。var
”复选框。;-)var
,可能有多个变量。现在它不仅支持let
和const
(但然后正确禁止var
),而且对于每个变量都_需要_单独的声明。这是JSLint最明显的180度转变之一。 - ruffin在我看来,个人偏好是唯一的区别,没有明显的差异。
我不喜欢有多个变量声明,所以通常会这样做:
var
one
,two
,three
,four
;
由于它更短且更易读,因此没有var
噪音需要查看。
var one, two, three four;
。在JavaScript中为了多加行数而增加代码行可能是危险的(JS解释器可能会插入自己的;
--如果你没有预料到这一点,那么你很快就会发现副作用。此外,前导,
令我不舒服,关键字单独一行也让我不舒服,;
单独一行也让我不舒服。你是按行计费吗? - STWvar
声明中间发生。(虽然我同意你关于前导逗号、var
和最后的分号都要独占一行的看法 - 这三个问题也让我感到不舒服。) - nnnnnn由于我没有看到相关的参考资料,这里是ECMA-262规范的链接,该规范是JavaScript的基础规范。该页面中的语法如下:
12.2 Variable Statement
Syntax
VariableStatement :
var VariableDeclarationList ;
VariableDeclarationList :
VariableDeclaration
VariableDeclarationList , VariableDeclaration
VariableDeclarationListNoIn :
VariableDeclarationNoIn
VariableDeclarationListNoIn , VariableDeclarationNoIn
VariableDeclaration :
Identifier Initialiseropt
VariableDeclarationNoIn :
Identifier InitialiserNoInopt
Initialiser :
= AssignmentExpression
InitialiserNoIn :
= AssignmentExpressionNoIn
VariableDeclaration
并被完全相同地处理。脚本引擎处理这两个声明应该没有区别。唯一的区别是其他答案已经提到的 - 节省更多空间以及在编译脚本时应用语法查找所有VariableDeclarations
所花费的时间几乎不可测量。我更喜欢第二个版本(每个都有自己的var
)。我认为这是因为我来自C++背景。在C++中,你可以像你在第一个例子中那样声明变量,但这是不被赞同的(当你试图以这种方式创建指针时,很容易出现错误)。
第一种方法可以节省一些字符--因此在JS文件大小和带宽消耗方面会有微小的节省。只有在极端情况下才会注意到这一点。