在同一范围内声明两次Javascript变量 - 这是一个问题吗?

Cur*_*urt 30 javascript variables scope

以下代码会导致任何问题吗?:

var a = 1;
var a = 2;
Run Code Online (Sandbox Code Playgroud)

我的理解是javascript变量是在范围的开头声明的.例如:

var foo = 'a';
foo = 'b';
var bar = 'c';
Run Code Online (Sandbox Code Playgroud)

处理为:

var foo;
var bar;
foo = 'a';
foo = 'b';
bar = 'c';
Run Code Online (Sandbox Code Playgroud)

因此,我的初始代码段将成为:

var a;
a = 1;
a = 2;
Run Code Online (Sandbox Code Playgroud)

或者它会成为:

var a;
var a;
a = 1;
a = 2;
Run Code Online (Sandbox Code Playgroud)

我知道在同一范围内两次声明一个javascript变量并不是一个好习惯,但我对这样做的影响更感兴趣.

Dan*_*nte 35

正如你所说,通过两倍多相同的var,JavaScript将该声明移到范围的顶部,然后你的代码将变成这样:

var a;
a = 1;
a = 2;
Run Code Online (Sandbox Code Playgroud)

因此,它不会给我们任何错误.

for循环也会出现同样的行为(它们的标题中没有局部作用域),因此下面的代码非常常见:

for (var i = 0; i < n; i++) {
    // ...
}
for (var i = 0; i < m; i++) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么像Douglas Crockford这样的JavaScript专家建议程序员手动将这些声明移到范围的顶部:

var i;    // declare here
for (i = 0; i < n; i++) {    // initialize here...
    // ...
}
for (i = 0; i < m; i++) {    // ... and here
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 将`var i;`手动移到顶部有什么好处? (7认同)
  • @ k.stm您还将使用更少的字符来减少文件中的几个字节,这在您向客户端发送大量js文件时很有用:) (2认同)
  • 对应点-如果两个var声明除了增加几个字节没有什么害处,那为什么还要冒险将声明移到顶部并引入潜在的无意创建全局变量的风险,因为我认为它已经被声明了。似乎在复杂的多文件环境中是可能的。 (2认同)