4

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

4

3 回答 3

5

考虑到它如何影响作用域链,我将其称为不好的做法。

看看 Douglas Crockford 的这篇文章:“声明被认为是有害的

于 2010-12-28T19:37:11.710 回答
4

马特回答中链接的简短摘要是使用“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;

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

于 2010-12-28T19:42:38.950 回答
0

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

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

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

现在连接到with

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

于 2010-12-28T19:47:37.393 回答