在for
/ in
循环中声明循环特定变量的正确语法是什么?
前两个似乎都工作(并且不会在Google Closure Compiler中引发任何标志),但只有第三个通过了Crockford的JS Lint。我不愿意使用它,主要是因为它不紧凑。
JSLint抱怨val
是一个坏变量(当我不添加var
时),或者应该移动声明。
第一个或第二个选项有任何缺点吗?我该怎么用? (示例假设str
是声明的字符串,vals
是声明的对象)
for(val in vals)
{
if(vals.hasOwnProperty(val))
{
str += val;
}
}
for(var val in vals)
{
if(vals.hasOwnProperty(val))
{
str += val;
}
}
var val;
for(val in vals)
{
if(vals.hasOwnProperty(val))
{
str += val;
}
}
答案 0 :(得分:3)
随意忽略JSLint。这比任何事情都更准确。第二和第三功能相同,随意使用(我使用第二个)。第一个公开了一个全局'val'变量,所以不要这样做:)
仅供参考,第三个背后的原因是内联变量声明比发现/查找更难:
var a, b, c, d, e;
位于函数顶部。
答案 1 :(得分:1)
除了在变量声明背后的cwolves推理之外,JSLint还在考虑variable hoisting。
话虽这么说,我在写循环时更喜欢选项#2。不过,我确实在函数的顶部定义了其余的变量。所以我喜欢:
function foo(a) {
var b, c = {d: "e", f: "g"};
for (var i = 0, j = a.length; i < j; i += 1) {
...
}
for (var h in c) {
if (c.hasOwnProperty(h)) {
...
}
}
}
答案 2 :(得分:1)
val
变量成为隐式全局变量。
隐含的全局变量是100%糟糕的,应该避免。
val
变量成为包含范围的变量。如果您的代码在函数内,则val
变量将成为该函数的局部变量。两种选择都是等价的。 (我更喜欢2.选项。)
JSLint将抛出,因为Crockford的想法是始终在代码顶部声明所有变量。这对于更大的代码(例如> 100行)更有意义 - 在这种情况下,您可以考虑将声明移出for和for-in语句,并将它们放在代码的顶部。这样,您就可以很好地了解所有局部变量。