Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript for in循环前面的变量名定义_Javascript - Fatal编程技术网

Javascript for in循环前面的变量名定义

Javascript for in循环前面的变量名定义,javascript,Javascript,给出Javascript代码片段的好部分(第24页): 为什么在for in循环中使用变量name之前要定义它,因为它在没有它的情况下可以工作 var name = 1; name = 1; 这两件事是不同的。对于第一行,name是在当前函数范围下取消声明的变量,而第二行相当于window.name=1(如果name在当前范围内未标记)除非有很好的理由,否则永远不要在全局范围内声明临时变量。这里需要注意两件不同的事情 var 如果没有var,变量将是全局变量,除非它已在更大范围内声明。(事实上

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

为什么在
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) {