我在想这样的东西 with(Math){document.body.innerHTML= PI} 不完全是好习惯。

有帮助吗?

解决方案

考虑到它如何影响范围链,我将其称为不良练习。

看看道格拉斯·克罗克福德(Douglas Crockford)的这篇文章:”陈述被认为有害"

其他提示

Matt回答中链接的简短摘要是,使用“ WAND”陈述的问题是,“ WIND” w with with's块中的变量是模棱两可的。使用以下示例:

with(foo.doo.diddly.doo){
  bar = 1;
  baz = 1;
}

如果您不确定foo.doo.diddly.doo具有栏或BAZ属性,那么您不知道该列表中的栏和BAZ是否已被执行,或者是一些全球栏和BAZ。最好使用变量:

var obj = foo.doo.diddly.doo;

obj.bar = 1;
obj.baz = 1;

不过,在您的示例中,数学几乎没有足够长的术语来证明甚至使用变量是合理的,但是我猜想您的详细应用程序比您使用的问题要多。

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

但是,如果您访问它们一次,则应将参考存储在本地变量中。这有两个优点:

  1. (嵌套)属性不需要一次比一次(可能在慢速的继承链中!)。
  2. 尤其是全局对象(但是当前范围中不在当前范围中的任何对象)只需要查找 一次 在范围链中。随后的访问将更快。

现在与 with:

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top