Javascript for循环中的变量范围

Cli*_*ote 22 javascript

有什么区别:

function bar()
{
  for (x=0; x< 100; x++) {}
}
Run Code Online (Sandbox Code Playgroud)

function bar()
{
  var x;
  for (x=0; x< 100; x++) {}
}
Run Code Online (Sandbox Code Playgroud)

如果x没有在该函数之外声明,那么它不是全局变量?我总是这么想,因为我通常不会声明仅在循环中使用的一次性变量,但我想知道这是否会破坏浏览器中的可比性等.

cob*_*bal 34

第一个例子将添加或修改全局变量x,如果不是所需的结果,通常要避免这种情况.

虽然你的第二个例子是按照需要工作的(没有副作用),但在我看来,这个替代方案看起来会更好

function bar()
{
  for (var x=0; x< 100; x++) {}
}
Run Code Online (Sandbox Code Playgroud)

  • 它可能看起来更好,但JavaScript没有块范围,因此无论你在`for`循环内部还是外部声明`x`都是如此.(JS 1.7引入了`let`关键字,请参见noha的答案.) (17认同)
  • +1总是添加var.我已经看过很多情况,其中一个循环使用'i'调用一个函数,使用'i'调用自己的循环,其中两个都更新全局'i'.在某些情况下可能会被忽视,但在其他情况下却完全搞砸了. (2认同)

Nor*_*rtl 16

在声明/使用变量时会创建变量.如果省略var关键字,则在全局范围内自动创建变量.所以你会产生副作用.通常要避免这种情况.

假设您使用全局变量,然后您选择了该软件的其他部分已经采用的变量名称.这将导致一些代码覆盖其值的情况.这会产生错误,并且大部分时间都难以调试.在您的示例中,您可能会覆盖另一个软件正在使用的全局变量x.

使用var也更快.如果访问全局变量,则必须扫描所有范围,直到变量名称的全局范围.通过使用var,它绑定到您的本地范围.

最好使用always use var.或者更好:为变量选择最窄的范围总是好的.现在你有全局和var.无论您在何处声明,都可以在整个函数中看到var声明.在javascript 1.7中引入了新关键字:let.让我们进一步缩小范围.如果你声明你的for循环

for(let x = 0; x < 100; i++) {}
Run Code Online (Sandbox Code Playgroud)

比x仅在{}块内可见.