for循环前面的变量名定义

时间:2014-05-08 21:10:36

标签: javascript

给出来自Javascript的代码段好的部分(第24页):

var name;
for (name in another_stooge) {
    if (typeof another_stooge[name] !== 'function') {
        document.writeln(name + ": " + another_stooge[name]);
    }
}

为什么在name循环中使用之前有变量for in的定义,因为它在没有它的情况下可以工作?

5 个答案:

答案 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,可能原始编码器没有意识到还有另一种方式。