可能重复:
Are there legitimate uses for JavaScript's “with” statement?
在“JavaScript好的部分”中,with
被认为是javascript的一个不好的部分,但请看这个片段:
var foo={foof:function(){console.log(this)}}
var fuu={fuuf:function(){console.log(this)}}
with(foo){
console.log(this);
with(fuu){
console.log(this);
foof();
fuuf();
}
}
with
真的那么糟糕吗? with
有时可以提供乐趣或优势,谁可以举一个例子?
答案 0 :(得分:5)
这很方便,但它仍有一个根本问题,可以让你快速陷入困境。考虑一下:
var foo={foof:function(){console.log(this)}}
var fuu={fuuf:function(){console.log(this)}}
with(foo){
console.log(this);
with(fuu){
console.log(this);
foof();
fuuf();
}
myProp = "blah";
}
现在我们分配到myProp
时发生了什么?
很难说。
如果foo
包含名为myProp
的属性,则其值现为"blah"
。但如果没有,那么我们只是将"blah"
分配给全局对象的myProp
(可能是window
)。在这个简单的例子中很容易分辨出这是怎么回事,但是如果foo
早先定义了1000行呢?或者在另一个文件中?那不容易。
更多信息以及您问题的实际答案:
Are there legitimate uses for JavaScript's "with" statement?
在这里:
http://www.yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/
答案 1 :(得分:1)
with
的问题在于,你在做什么有些含糊不清。例如,您的foof()
函数调用也可能是其他地方定义的函数。很难一目了然地看到正在使用的是什么。
答案 2 :(得分:0)
我可举一个例子,john resigs简单(并且非常受欢迎)client side templating function.
<editorial>
好的部分是一本改变生活的现象书,但是crockford并不是可以消化的,并且经常会宣称一些真正属于品味的东西(如果陈述的话,就像一行一样)与同样的权威是坏的,他说真正可怕的事情是坏的(就像整个隐含的全局/显式本地事物一样)。
<editorial>
mdc页面上解决了with
的问题
function f(x, o) {
with (o)
print(x);
}
基本上,x的值在运行时之前是不明确的。如果o有一个名为x的属性,则x将是该属性。如果没有,x将是传入的东西。这意味着阅读代码的开发人员可能很难搞清楚x的含义,更重要的是,JS解释器将无法应用某些类型的优化,否则它将能够到。
<opinion>
现在个人而言,我发现它具有完全可读性,并且我永远不会按照上面示例中的名称命名变量,因此我发现可读性和模糊性参数hogwash。至于perf参数,只要我们不是在谈论愚蠢(比如将你的应用程序放在一个带有块的一半),主要是过早优化的论据,你真正在谈论几乎无法估量的浪费时间。现实世界的场景。我认为这是一种高度情境化的语言特性,只有当替代方案要么明显更多,或者可读性较差的代码才会被替代时,才应该使用它。
</opinion>