【发布时间】:2010-12-28 19:35:54
【问题描述】:
我认为像with(Math){document.body.innerHTML= PI} 这样的东西并不是一个好的做法。
【问题讨论】:
-
为什么不
document.body.innerHTML= Math.PI
我认为像with(Math){document.body.innerHTML= PI} 这样的东西并不是一个好的做法。
【问题讨论】:
document.body.innerHTML= Math.PI
考虑到它如何影响作用域链,我认为这是不好的做法。
看看 Douglas Crockford 的这篇文章:“with Statement Considered Harmful”
【讨论】:
var here = Math; document.body.innerHTML = here.PI? (我知道你不会那样做,这只是一个例子。
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;
不过,在您的示例中,即使使用变量,数学也不足以证明其合理性,但我猜您的想法比您用于问题的应用程序更冗长。
【讨论】:
如果您访问(嵌套)对象属性一次,则无需“缓存”它们。
但是,如果您不止一次地访问它们,那么您应该将引用存储在局部变量中。这有两个好处:
现在连接到with:
它在当前作用域链的开头生成一个新作用域。这意味着对其他变量/对象的任何访问都将花费至少一次范围查找,即使是对函数本地的变量也是如此。
【讨论】: