for(var propertyName in object)vs for(propertyName in object)?

问题描述:

这两种迭代对象的属性名称的方法中哪一种更可取?for(var propertyName in object)vs for(propertyName in object)?

for (var propertyName in object) { 

} 

for (propertyName in object) { 

} 

我知道在第二个例子中,propertyName的成为一个全局变量,这是一件好事,以避免,所以我想第一个会更好,对不对?至于你说

var a = 0; // option 1 
b = 0;  // option 2 

+0

是的,第一个更好,尽管在单独的`var`语句中声明变量也是完全可以的。 – Pointy 2011-12-15 14:41:34

这个问题可以被简化为

  • var在选项1限制新变量的范围;它也允许阴影;
  • 选项2将导致一个新的全局变量,或将值0赋值给范围内的任何名为b的现有变量。

选项1因此确实“更好”。

(然而,值得注意的是,中propertyName在你的第一个例子中的范围将是封闭功能,循环体或任何封闭条件块的的。)

是。正是你说的原因。如果在其他地方不需要,为什么要将数据从循环中移出?

+0

但JavaScript范围是这样的,变量将在发生该循环的整个函数中可见。在这方面,JavaScript与其他类似C语言显着不同。 – Pointy 2011-12-15 14:43:52

第一个。这是

var propertyName; 
for (propertyName in object) ... 

相当于这取决于你的特殊的用法,但我要说的是,你的第一个例子中的99.9%是合适的。将var关键字排除在外不一定会使propertyName处于全局状态。它也可以引用父范围中先前定义的变量。