我认为像这样的东西with(Math){document.body.innerHTML= PI}
并不是很好的做法。
问问题
1898 次
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
如果您访问(嵌套)对象属性一次,则无需“缓存”它们。
但是,如果您不止一次地访问它们,那么您应该将引用存储在局部变量中。这有两个优点:
- (嵌套)属性不需要多次查找(可能在很慢的继承链中!)。
- 特别是全局对象(但任何不在当前范围内的对象)只需要在范围链中查找一次。后续访问会更快。
现在连接到with
:
它在当前作用域链的开头生成一个新作用域。这意味着对其他变量/对象的任何访问都将花费至少一次范围查找,即使是对函数本地的变量也是如此。
于 2010-12-28T19:47:37.393 回答