首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JavaScript的"for- in“循环中有没有"var”?

在JavaScript的"for- in“循环中有没有"var”?
EN

Stack Overflow用户
提问于 2011-04-19 21:28:54
回答 9查看 60.6K关注 0票数 107

用JavaScript编写for-in循环的正确方法是什么?浏览器不会对我在这里展示的两种方法中的任何一种发出抱怨。首先,有一种方法是显式声明迭代变量x

代码语言:javascript
复制
for (var x in set) {
    ...
}

或者,这种方法读起来更自然,但在我看来并不正确:

代码语言:javascript
复制
for (x in set) {
    ...
}
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-04-19 21:36:49

使用var,它缩小了变量的作用域,否则变量将查找最近的闭包来搜索var语句。如果它不能找到一个var,那么它是全局的(如果你在严格模式下,using strict,全局变量抛出一个错误)。这可能会导致如下问题。

代码语言:javascript
复制
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 Scoping and Hoisting

票数 110
EN

Stack Overflow用户

发布于 2011-04-19 21:39:44

第一个版本:

代码语言:javascript
复制
for (var x in set) {
    ...
}

声明一个名为x的局部变量。第二个版本:

代码语言:javascript
复制
for (x in set) {
    ...
}

不会。

如果x已经是一个局部变量(例如,您在当前作用域(即current函数)中较早的某个位置有一个var x;var x = ...; ),那么它们将是等价的。如果x还不是一个局部变量,那么使用第二个变量将隐式声明一个全局变量x。考虑下面的代码:

代码语言:javascript
复制
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();

您可能认为这会向heythereheliheytherecopter发出警报,但由于x是同一个,它将向heythere、<代码>D18、<代码>D19、<代码>D20、<代码>D21发出警报。你不会想这样的!在for循环中使用var x

最重要的是:如果for循环在全局作用域中(即不在函数中),则局部作用域(如果使用var x,则在中声明作用域x )与全局作用域(如果使用不带xx,则在中隐式声明作用域var)相同,因此两个版本将是相同的。

票数 40
EN

Stack Overflow用户

发布于 2011-04-19 22:01:44

实际上,如果你不喜欢在for标题中声明,你可以这样做:

代码语言:javascript
复制
var x;
for (x in set) {
    ...
}

正如在对这个问题的其他回答中所提到的,根本不使用var会产生不必要的副作用,比如分配全局属性。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5717126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档