【问题标题】:Should I use var in the for in construct?我应该在 for in 构造中使用 var 吗?
【发布时间】:2014-02-18 02:28:04
【问题描述】:

我在一段 JavaScript 逻辑中使用了 for in 循环。 我应该使用 var 关键字吗?

当我按照 W3School 的示例运行 for-in 循环时,如果没有 var,那么作为副作用,它会被定义为全局范围(窗口)上的属性:

(function () {

  var object = {
      a: 1,
      b: 2
  }
  for (varName in object) {
      alert(varName + " is" + object[varName])
  }

})();

alert(window.varName) //Returns "b" !
//This returns undefined when the for-in is rewritten as for (var varName in object).

编辑:这里是上面代码的一个小提琴供您欣赏:http://jsfiddle.net/94uEh/

哪种是正确的首选形式? - 注意我希望支持 IE 8 (EcmaScript

【问题讨论】:

  • 不要使用 W3Schools - 很多错别字和不良信息。这是一个更好的资源:@​​987654322@
  • RobH 是的,我完全同意。但是,Mozilla 文档包含一个非常相似的示例; "for (variable in object) { ... } "
  • 是的 - 既没有定义 variable 也没有定义 object - 这是显示语法的伪代码;这些例子是正确的。

标签: javascript var for-in-loop


【解决方案1】:

如果您希望该值是本地的,则应始终使用 var

不建议对变量使用关键字object,您可能会遇到跨浏览器的未定义行为。

此外,您通常应该避免将假定为本地的任何内容应用于全局范围。

这很糟糕:

for (varName in object) {
    alert(varName + " is" + object[varName])
}

这是正确的:

for (var varName in object) {
    alert(varName + " is" + object[varName])
}

如果你需要在全局范围内访问这个值,你可能做错了。在全局范围内也有 this 是没有用的,因为它只是最后一个值,将存在于 varName 中。

【讨论】:

  • 我刚刚在 IE8(我要支持的浏览器)中对此进行了测试,并且使用 var 关键字可以按预期工作。我将此标记为答案。附言我选择名称对象完全是出于演示目的,并没有在我的真实代码中实际使用 :) 但我很好奇为什么 Mozilla 和 W3Schools 文档都包含带有错误编码准则的示例。 (他们都省略了 var!)。
  • 啊,是的,你是对的。 Mozilla 页面提供了正确的示例。然而,W3Schools 仅包含糟糕的代码。
  • @Joeppie 是的,如果有其他来源,应避免使用 W3Schools。他们通常会展示非常糟糕的例子。
  • 我通过“报告错误”链接通知了 W3Schools 他们不幸的例子。
【解决方案2】:

您应该始终使用var,否则您正在访问一个全局变量(并且存在覆盖其他人的变量的风险)

【讨论】:

    猜你喜欢
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多