JavaScript的“ for-in”循环中是“ var”还是没有“ var”?

| 用JavaScript编写“ 0”循环的正确方法是什么?浏览器不会对我在此处显示的两种方法提出任何投诉。首先,有一种方法可以明确声明迭代变量“ 1”:
for (var x in set) {
    ...
}
另外,这种方法更自然,但对我来说似乎不正确:
for (x in set) {
    ...
}
已邀请:
使用
var
,它将减小变量的范围,否则变量将查找最接近的闭包以查找searching4ѭ语句。如果找不到
var
,则它是全局的(如果在严格模式下,
using strict
,则全局变量将引发错误)。这可能会导致如下问题。
function f (){
    for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2
如果在for循环中写
var i
,警报将显示
2
。 JavaScript范围界定和提升
第一个版本:
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
。你不要那个!在
for
循环中使用
var x
。 最重要的是:如果
for
循环在全局范围内(即不在函数中),则局部范围(如果使用
var x
则声明范围
x
)与全局范围相同(范围
x
如果使用不带var的
x
隐式声明,则两个版本将相同。
您确实应该始终使用
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
  ...
});
从IE9开始,Array原型上提供了“ 42”方法。
实际上,如果您不喜欢
for
标题内的声明,则可以执行以下操作:
var x;
for (x in set) {
    ...
}
如该问题的其他答案所述,完全不使用ѭ4会产生不必要的副作用,例如分配全局属性。
使用一个用
var
声明循环变量的变量。隐式声明的变量具有不同的范围,可能不是您想要的。
for(var i = 0; ...)
是一种常见的模式,但与
for(int i; ...)
在C ++中,该变量的作用域不是
for
块。实际上,
var
被吊在封闭示波器(功能)的顶部,因此本地的
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
let
const
声明的变量)而不是隐式全局变量。 如果您使用
\"use strict\";
(应按要求)且未声明
i
,则
for(i=0; ...)
for(i in ...)
将失败。
使用
var
是最干净的方法,但是两者都按以下说明工作:https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in 基本上,使用
var
可以确保创建一个新变量。否则,您可能会意外使用先前定义的变量。
由于性能原因,我认为var很好。 Javascript不会遍历整个全局范围来查看x是否在其他地方已经存在。
从一般的角度来看,第一个版本将用于必须在循环范围内的索引,而另一个版本将是调用循环的构造函数的范围内的任何变量。 如果您要在for循环中使用loop的索引,而其他行将不需要使用该索引,则最好使用\“ var \”声明变量,以便确保\“ x \“是为循环的索引初始化为0,而另一个,如果在此上下文中还有其他\” x \“变量可用,则该变量将被循环的索引覆盖-那就是你会有一些逻辑错误-

要回复问题请先登录注册