给出来自Javascript的代码段好的部分(第24页):
var name;
for (name in another_stooge) {
if (typeof another_stooge[name] !== 'function') {
document.writeln(name + ": " + another_stooge[name]);
}
}
为什么在name
循环中使用之前有变量for in
的定义,因为它在没有它的情况下可以工作?
答案 0 :(得分:8)
这里要注意两件事。
<强> VAR 强>
如果没有var
,变量将是全局变量,除非它已在更广泛的范围内声明。 (在strict mode中,这将是一个错误,而不是一个全局的。)
循环之前
您可以拥有for (var name…
,但这样会更难发现var
声明。
Douglas Crockford(The Good Parts的作者,在这里非常相关)主张在函数顶部声明所有局部变量,这样你就有了一个地方可以找到你的范围。
答案 1 :(得分:1)
var name = 1;
name = 1;
这两个是不同的东西。对于第一行,name
是在当前函数范围下的deaclared变量,而第二行等同于window.name = 1
(如果name
在当前范围内未被声明为decalred。)你永远不应该在全局范围内声明临时变量,除非你背后有一个很好的理由。
答案 2 :(得分:1)
建议函数的所有变量都在同一个地方定义,所以如果你有多个变量,那么循环中的那个变量将被定义:
var a, b, name; //etc
for (name in another_stooge) {
if (typeof another_stooge[name] !== 'function') {
document.writeln(name + ": " + another_stooge[name]);
}
}
这与以下部分相关:&#34;最佳实践&#34;。
答案 3 :(得分:1)
是的,但在这种情况下,名称将是global variable,并且行为会有所不同。因此,如果你在好的部分之后使用var,那么你使用的每个变量(全局变量都不好)。 但你可以像这样缩短代码......
for (var name in another_stooge) {
这将使名称成为范围变量......
答案 4 :(得分:0)
编辑:假设你问为什么不
for (var name in another_stooge)
风格问题。
与许多其他语言不同,JavaScript是功能范围,而不是阻止范围。
因此,许多程序员将手动“提升”他们的var
声明到函数的顶部,以使其显而易见。
或者 - 考虑到在该代码中使用document.write
,可能原始编码器没有意识到还有另一种方式。