任何人都可以告诉我为什么对多个变量使用一个var声明并在换行符上声明每个变量是否是一个很好的编程行为?
// bad
var items = getItems();
var goSportsTeam = true;
var dragonball = 'z';
// good
var items = getItems(),
goSportsTeam = true,
dragonball = 'z';
答案 0 :(得分:7)
它不被认为是“好”或“坏”。这是一个偏好的问题。
构建代码质量工具JSLint的人,Douglas Crockford喜欢它。
它可能具有的一个“优点”是它避免了variable hoisting的可能性。在JavaScript中,所有var
声明都会自动移到其作用域的顶部。
这就是Crockford认为第二种选择更好的原因:
在具有块范围的语言中,通常建议在首次使用的站点声明变量。但是因为JavaScript没有块范围,所以在函数顶部声明所有函数的变量是明智的。建议每个函数使用一个var语句。这可以通过vars选项拒绝。
答案 1 :(得分:1)
这是一种偏好,我不会说好或坏。是的JSLint抱怨它,我真的不喜欢它抱怨for
循环变量也是内联的。它被放入JSLint的原因是为了防止可能的悬挂混乱。
同样在某些情况下,在顶部声明所有变量会导致文件略小一些。请考虑以下事项:
var a = 10;
a++;
var b = 20;
Google Closure运行后
var a=10;a++;var b=20;
与此相反,如果我们将b
的声明拉到最顶层。
var a=10,b;a++;b=20;
答案 2 :(得分:0)
主要的好处(除了样式偏好,我猜)它会阻止你编写遭受意外变量提升后果的代码。
举个例子:
var foo = function(){alert('foo');}
function bar(){
foo();
var foo = function(){alert('foobar')};
foo();
}
bar();
通过阅读此代码,bar
的意图似乎如下:
foo
函数以提醒字符串'foo'
。foo
。foo
函数以提醒字符串'foobar'
。实际上,会发生什么:
foo
被提升到bar
函数的顶部。 foo
现在实际上是指局部变量而不是同名的外部变量。但由于尚未分配本地,因此其值未定义。因此,当您尝试调用foo
时,您将获得TypeError。答案 3 :(得分:0)
Crockfords偏好的论据已经做得很好并且是有效的。我现在才刚刚开始回归第一种格式,因为我相信对于那些了解可变吊装并且不太可能犯规的有经验的开发人员来说,我能想到的有两个优点:
将新变量添加到定义列表时,可以更轻松地进行差异化。这意味着您可能会遇到更少的合并冲突(虽然它们可能很难解决),并且在分析差异时会减少认知负担。由于类似的原因,我也被转换为悬空逗号,我永远不会想到xD
正如@ldsenow所确定的那样,它可以使搜索变量定义更加简单。您将始终能够搜索var <name>
并获得您想要的结果,而不是其他任何内容。