在JavaScript不良练习中使用吗?
-
13-10-2019 - |
题
我在想这样的东西 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;
不过,在您的示例中,数学几乎没有足够长的术语来证明甚至使用变量是合理的,但是我猜想您的详细应用程序比您使用的问题要多。
如果您一次访问(嵌套)对象属性,则无需“缓存”它们。
但是,如果您访问它们一次,则应将参考存储在本地变量中。这有两个优点:
- (嵌套)属性不需要一次比一次(可能在慢速的继承链中!)。
- 尤其是全局对象(但是当前范围中不在当前范围中的任何对象)只需要查找 一次 在范围链中。随后的访问将更快。
现在与 with
:
它在当前范围链的开头生成了新的范围。这意味着对其他变量/对象的任何访问都会至少花费一个范围查找,即使是函数本地的变量。
不隶属于 StackOverflow