with关键字在javascript中是不是很糟糕?

时间:2011-02-17 02:41:33

标签: javascript

  

可能重复:
  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有时可以提供乐趣或优势,谁可以举一个例子?

3 个答案:

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