Answers:
使用var
,它会减小变量的范围,否则变量将查找最接近的闭包以查找var
语句。如果找不到,var
则表示它是全局的(如果处于严格模式下using strict
,则全局变量将引发错误)。这可能会导致如下问题。
function f (){
for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2
如果您var i
在for循环中编写警报,则会显示2
。
var
内部置于for
头部似乎是在for循环中是局部的,实际上不是。因此,我更喜欢下面的user422039样式。
第一个版本:
for (var x in set) {
...
}
声明一个名为的局部变量x
。第二版:
for (x in set) {
...
}
才不是。
如果x
已经是局部变量(即您在当前作用域(即当前函数)中早于var x;
或var x = ...;
某处),则它们将是等效的。如果x
还不是局部变量,则使用第二个变量将隐式声明一个全局变量x
。考虑以下代码:
var obj1 = {hey: 10, there: 15};
var obj2 = {heli: 99, copter: 10};
function loop1() {
for (x in obj1) alert(x);
}
function loop2() {
for (x in obj2) {
loop1();
alert(x);
}
}
loop2();
你可能会想到这警报hey
,there
,heli
,hey
,there
,copter
,但因为x
是一个,它会提醒一样hey
,there
,there
,hey
,there
,there
。你不要那个!var x
在for
循环中使用。
最重要的for
是:如果循环在全局范围内(即不在函数中),则局部范围(x
如果使用,则声明该范围var x
)与全局范围相同(该范围x
在隐式声明如果您x
不使用var),那么这两个版本将完全相同。
你真的应该声明局部变量用var
,始终。
您也不应使用“ for ... in”循环,除非您完全确定这就是您想要的。为了遍历实数组(这很常见),您应该始终使用带有数字索引的循环:
for (var i = 0; i < array.length; ++i) {
var element = array[i];
// ...
}
用“ for ... in”遍历普通数组可能会产生意想不到的结果,因为您的循环可能会拾取除数字索引属性之外的数组属性。
编辑 -在2015年这里还可以使用.forEach()
遍历数组的方法:
array.forEach(function(arrayElement, index, array) {
// first parameter is an element of the array
// second parameter is the index of the element in the array
// third parameter is the array itself
...
});
.forEach()
从IE9开始,该方法存在于Array原型中。
for(var i = 0; ...)
是一种常见的模式,但与
for(int i; ...)
在C ++中,变量没有作用于for
块。实际上,将var
gets提升到封闭范围(函数)的顶部,以便i
在for
循环之前(当前范围/函数的开始之后)和之后都可以有效地使用局部变量。
换句话说,请执行以下操作:
(function(){ //beginning of your current scope;
//...
for(var i in obj) { ... };
})();
是相同的:
(function(){ //beginning of your current scope;
var i;
//...
for(i in obj) { ... };
})();
ES6使用let
关键字(而不是var
)将范围限制为for块。
当然,您应该使用局部变量(在ES6 中用var
or let
或or 声明的局部变量const
)而不是隐式全局变量。
for(i=0; ...)
否则for(i in ...)
会失败,如果您使用"use strict";
(应按要求使用)i
且未声明。
使用var
是最干净的方法,但是两者都按以下说明工作:https : //developer.mozilla.org/en/JavaScript/Reference/Statements/for...in
基本上,通过使用var
确保您创建了一个新变量。否则,您可能会意外使用先前定义的变量。
从一般的角度来看,第一个版本将用于必须在循环范围内的索引,而另一个版本将是调用循环的构造函数的范围内的任何变量。
如果您打算在for循环中使用loop的索引,而其他行将不需要使用该索引,则最好使用“ var”声明该变量,这样您就可以确保“ x”是for循环的索引以0初始化,而另一个,如果在此上下文中有其他“ x”变量可用,则该变量将被循环的索引覆盖-也就是说,您将遇到一些逻辑错误-。
var
不习惯声明迭代器i
:Uncaught ReferenceError: i is not defined
。因此,我将从现在开始使用它:/ webpack奇怪地对待“全局”变量,有关更多信息,请参见: stackoverflow.com/a/40416826