Javascript for循环中的变量范围

时间:2009-04-26 09:35:06

标签: javascript

有什么区别:

function bar()
{
  for (x=0; x< 100; x++) {}
}

function bar()
{
  var x;
  for (x=0; x< 100; x++) {}
}

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

3 个答案:

答案 0 :(得分:34)

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

虽然你的第二个例子按预期工作(没有副作用),但我认为看起来更好的替代方案是

function bar()
{
  for (var x=0; x< 100; x++) {}
}

答案 1 :(得分:16)

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

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

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

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

声明你的for循环
for(let x = 0; x < 100; i++) {}

仅在{}块内可见。

答案 2 :(得分:2)

永远记住,在JavaScript中,范围是由函数定义的。 在示例中

function () {
    var x = 15;
    bar();
    function bar() {
      for (x=0; x< 100; x++) {}
    }
    //here x will be 100
}

您可能会意外地访问更高的范围。更高范围的意思是包装函数或window.x(如果没有更多的包装函数)。如果你只想在你的循环中使用x,那么坚持第二个例子会好得多。

function () {
    var x = 15;
    bar();
    function bar() {
        var x;
        for (x=0; x< 100; x++) {}
    }
    //here x will be 15
}