Javascript for in循环前面的变量名定义
给出Javascript代码片段的好部分(第24页): 为什么在Javascript for in循环前面的变量名定义,javascript,Javascript,给出Javascript代码片段的好部分(第24页): 为什么在for in循环中使用变量name之前要定义它,因为它在没有它的情况下可以工作 var name = 1; name = 1; 这两件事是不同的。对于第一行,name是在当前函数范围下取消声明的变量,而第二行相当于window.name=1(如果name在当前范围内未标记)除非有很好的理由,否则永远不要在全局范围内声明临时变量。这里需要注意两件不同的事情 var 如果没有var,变量将是全局变量,除非它已在更大范围内声明。(事实上
for in
循环中使用变量name
之前要定义它,因为它在没有它的情况下可以工作
var name = 1;
name = 1;
这两件事是不同的。对于第一行,
name
是在当前函数范围下取消声明的变量,而第二行相当于window.name=1
(如果name
在当前范围内未标记)除非有很好的理由,否则永远不要在全局范围内声明临时变量。这里需要注意两件不同的事情
var
如果没有var
,变量将是全局变量,除非它已在更大范围内声明。(事实上,这将是一个错误,而不是一个全球性的错误)
循环之前
您可以为(var name…设置,但这会使发现var
语句变得更加困难
Douglas Crockford(《好的部分》的作者,在这里非常相关)主张在函数顶部声明所有局部变量,这样你就有一个地方可以找到你的作用域。编辑:假设你在问为什么不
for (var name in another_stooge)
风格问题
与许多其他语言不同,JavaScript是函数范围的,而不是阻塞范围的
因此,许多程序员会手动将他们的var
声明“提升”到函数的顶部,以使其清楚地显示正在发生的事情
或者——考虑到文档的使用。在该代码中写入
,可能是原始编码人员没有意识到还有其他方法。建议将函数的所有变量定义在同一位置,因此如果有多个变量,则循环中的一个变量将在其中定义:
var a, b, name; //etc
for (name in another_stooge) {
if (typeof another_stooge[name] !== 'function') {
document.writeln(name + ": " + another_stooge[name]);
}
}
这与“最佳实践”一节有关。是的,但在这种情况下,名称将是a,并且会有不同的行为。因此,如果您在寻找好的部分,请对您使用的每个变量使用var(全局变量不好)。
但是你可以像这样缩短代码
for (var name in another_stooge) {
这将使名称成为作用域变量…我认为这是因为使用var使变量在函数作用域中..而不使用var使其具有全局作用域如果没有它,它将工作没有你问为什么不为(另一个工具中的var name)执行
?@Hawk,它不在任何函数中。它是放在.js文件中的代码,该文件是从.html文件调用的。@Derek朕會功夫, 它可以工作,因为它将所有属性名称和值写入html文档中。回答得好,我会在变量提升和范围中添加look,因为这将帮助问题变得更清楚。请注意:我不认为OP谈论的是在全局范围内声明它们,而是在for
语句中声明它们(即for(var name…
)@Groo-他在问题中问为什么在for
循环之前有一个name
声明,因为没有它它就可以工作。我回答说,如果name
没有在当前范围内声明,它将是全局的。哦,对不起,你是对的,应该仔细阅读它。
for (var name in another_stooge) {