在javascript中使用不良做法?

时间:2010-12-28 19:35:55

标签: javascript with-statement

我认为像with(Math){document.body.innerHTML= PI}之类的东西并不是一个好习惯。

3 个答案:

答案 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)

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

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

  1. (嵌套)属性不需要再查询一次(可能在继承链中很慢!)。
  2. 特别是全局对象(但不在当前范围内的任何对象)只需要在作用域链中查找一次。后续访问将更快。
  3. 现在连接到with

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