2009-04-26 118 views
22

有什么区别:如果x没有该功能的外声明,所以它不是一个全局变量变量范围在Javascript中的for循环

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

而且

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

?我总是想知道这一点,因为我通常不声明只在循环中使用的一次性变量,但我想知道这是否会在浏览器或其他类中破坏可比较性。

回答

34

第一个示例将添加或修改全局变量x,如果不是所需的结果,通常要避免该变量。

当你的第二个例子可以作为期望的(无副作用),看起来在我看来,更好的替代将是

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

任何未用“var”声明的变量将始终是一个全局变量。以下是var上的MDC条目:https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/Var – cdmckay 2009-04-26 10:34:16

+16

它可能看起来更好,但JavaScript没有块范围,因此无论您在里面声明了“x”或者在for循环之外。 (JS 1.7介绍`let`关键字,请参阅noha的回答。) – 2009-04-26 12:51:36

16

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

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

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

这是一个很好的做法,总是使用var。或者更好:为变量选择最窄范围总是很好的。现在你有全球和变种。无论您在哪里声明,都可以在整个函数中看到var声明。在JavaScript 1.7中引入了新的关键字:let。更缩小范围。如果您声明您的for循环与

for(let x = 0; x < 100; i++) {} 

比x只在{}块内可见。

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 
}