【问题标题】:Is using with in javascript bad practise?在 javascript 中使用 with 是不好的做法吗?
【发布时间】:2010-12-28 19:35:54
【问题描述】:

我认为像with(Math){document.body.innerHTML= PI} 这样的东西并不是一个好的做法。

【问题讨论】:

标签: javascript with-statement


【解决方案1】:

考虑到它如何影响作用域链,我认为这是不好的做法。

看看 Douglas Crockford 的这篇文章:“with Statement Considered Harmful

【讨论】:

  • 所以你应该改用这个? var here = Math; document.body.innerHTML = here.PI? (我知道你不会那样做,这只是一个例子。
  • @DarkLightA - 通常我只输入完整的参考名称。在少数情况下我会为较长的对象设置别名,但在大多数情况下,我坚持使用全名,只是为了方便以后阅读。
  • @Matt,你给自己+1了?? :D
  • @DarkLight:这是一个不同的马特。他只有5.5K声望。将鼠标悬停在评论中的名称或查看 URL 中的用户 ID。
【解决方案2】:

Matt 回答中链接的简短摘要是,使用“with”语句的问题是“with”块中的变量不明确。使用以下示例:

with(foo.doo.diddly.doo){
  bar = 1;
  baz = 1;
}

如果您不确定 foo.doo.diddly.doo 是否具有 bar 或 baz 属性,则您不知道 with 语句中的 bar 和 baz 是否正在执行,或者某些全局 bar 和 baz。最好使用变量:

var obj = foo.doo.diddly.doo;

obj.bar = 1;
obj.baz = 1;

不过,在您的示例中,即使使用变量,数学也不足以证明其合理性,但我猜您的想法比您用于问题的应用程序更冗长。

【讨论】:

    【解决方案3】:

    如果您访问(嵌套)对象属性一次,则无需“缓存”它们。

    但是,如果您不止一次地访问它们,那么您应该将引用存储在局部变量中。这有两个好处:

    1. (嵌套)属性不需要多次查找(可能在很慢的继承链中!)。
    2. 尤其是全局对象(但任何不在当前范围内的对象)只需要在范围链中查找一次。后续访问会更快。

    现在连接到with

    它在当前作用域链的开头生成一个新作用域。这意味着对其他变量/对象的任何访问都将花费至少一次范围查找,即使是对函数本地的变量也是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多