关于javascript:for循环前面的变量名称定义

Variable name definition in front of for in loop

本问题已经有最佳答案,请猛点这里访问。

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

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

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


这里有两个不同的注意事项。

VAR

如果没有var,变量将是全局变量,除非它已在更广泛的范围内声明。 (在严格模式下,这将是一个错误而不是全局)。

在循环之前

你可能有for (var name…但这使得发现var语句变得更加困难。

Douglas Crockford(The Good Parts的作者,在这里非常相关)主张在函数顶部声明所有局部变量,这样你就有了一个地方可以找到你的范围。


是的,但在这种情况下,名称将是一个全局变量,并且行为会有所不同。因此,如果你在好的部分之后使用var,那么你使用的每个变量(全局变量都不好)。
但你可以像这样缩短代码......

1
for (var name in another_stooge) {

这将使名称成为范围变量......


建议函数的所有变量都在同一个地方定义,所以如果你有多个变量,那么循环中的那个变量将在它们之间定义:

1
2
3
4
5
6
var a, b, name; //etc
for (name in another_stooge) {
    if (typeof another_stooge[name] !== 'function') {
        document.writeln(name +":" + another_stooge[name]);
    }
}

这与"最佳实践"部分有关。


1
2
var name = 1;
name = 1;

这两个是不同的东西。对于第一行,name是在当前函数作用域下的decalared变量,而第二行等效于window.name = 1(如果name尚未在当前作用域中进行十进制)。您永远不应在其中声明临时变量全球范围,除非你背后有一个很好的理由。


编辑:假设你问为什么不

1
for (var name in another_stooge)

风格问题。

与许多其他语言不同,JavaScript是函数作用域,而不是作用域限制。

结果,许多程序员将手动"提升"他们的var声明到函数的顶部,以使其显而易见。

或者 - 考虑到在该代码中使用document.write,可能原始编码器没有意识到还有另一种方式。