有什么区别:如果x没有该功能的外声明,所以它不是一个全局变量变量范围在Javascript中的for循环
function bar()
{
for (x=0; x< 100; x++) {}
}
而且
function bar()
{
var x;
for (x=0; x< 100; x++) {}
}
?我总是想知道这一点,因为我通常不声明只在循环中使用的一次性变量,但我想知道这是否会在浏览器或其他类中破坏可比较性。
有什么区别:如果x没有该功能的外声明,所以它不是一个全局变量变量范围在Javascript中的for循环
function bar()
{
for (x=0; x< 100; x++) {}
}
而且
function bar()
{
var x;
for (x=0; x< 100; x++) {}
}
?我总是想知道这一点,因为我通常不声明只在循环中使用的一次性变量,但我想知道这是否会在浏览器或其他类中破坏可比较性。
第一个示例将添加或修改全局变量x,如果不是所需的结果,通常要避免该变量。
当你的第二个例子可以作为期望的(无副作用),看起来在我看来,更好的替代将是
function bar()
{
for (var x=0; x< 100; x++) {}
}
变量在声明/时间使用它创建。如果省略了var关键字,则该变量将在全局范围内自动创建。所以你会产生副作用。这通常是要避免的。
假设您使用全局变量,然后选择了其他软件已经采用的变量的名称。这会导致代码片段覆盖其值的情况。这会产生错误,大部分时间很难调试。在你的例子中,你可能会覆盖另一个软件正在使用的全局变量x。
使用var也更快。如果你访问一个全局变量,它必须扫描所有的作用域到变量名的全局变量。通过使用var它绑定到您的本地范围。
这是一个很好的做法,总是使用var。或者更好:为变量选择最窄范围总是很好的。现在你有全球和变种。无论您在哪里声明,都可以在整个函数中看到var声明。在JavaScript 1.7中引入了新的关键字:let。更缩小范围。如果您声明您的for循环与
for(let x = 0; x < 100; i++) {}
比x只在{}块内可见。
请记住,在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
}
任何未用“var”声明的变量将始终是一个全局变量。以下是var上的MDC条目:https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/Var – cdmckay 2009-04-26 10:34:16
它可能看起来更好,但JavaScript没有块范围,因此无论您在里面声明了“x”或者在for循环之外。 (JS 1.7介绍`let`关键字,请参阅noha的回答。) – 2009-04-26 12:51:36