我认为像with(Math){document.body.innerHTML= PI}
之类的东西并不是一个好习惯。
答案 0 :(得分:5)
考虑到它如何影响范围链,我会称之为不好的做法。
看看道格拉斯·克罗克福德的这篇文章:“with Statement Considered Harmful”
答案 1 :(得分:4)
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;
在你的例子中,尽管使用变量证明数学是不够长的,但我猜你有一个比你用于问题更冗长的应用程序。
答案 2 :(得分:0)
如果访问(嵌套)对象属性一次,则不需要“缓存”它们。
但是如果你多次访问它们,那么你应该在一个局部变量中存储一个引用。这有两个好处:
现在连接到with
:
它在当前范围链的开头生成一个新范围。这意味着对其他变量/对象的任何访问都将花费至少一个范围查找更多,甚至对函数本地的变量也是如此。