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

Is the with keyword that bad in javascript?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Are there legitimate uses for JavaScript's “with” statement?

在"JavaScript the Good Parts"中,with被认为是javascript的一个不好的部分,但请看这个片段:

1
2
3
4
5
6
7
8
9
10
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有时可以提供乐趣或优势,谁可以举个例子?


这很方便,但它仍然有一个根本问题,可以让你快速陷入困境。考虑一下:

1
2
3
4
5
6
7
8
9
10
11
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行呢?或者在另一个文件中?那不容易。

更多信息和您问题的实际答案:

JavaScript的"with"语句是否有合法用途?

和这里:

http://www.yuiblog.com/blog/2006/04/11/with-statement-considered-harmful/


with的问题在于你所做的事情有些含糊不清。例如,您的foof()函数调用也可能是其他地方定义的函数。很难一目了然地看到正在使用的是什么。


我举个例子,john resigs简单(并且非常受欢迎)客户端模板功能。


好的部分是一本改变生活的现象书,但是crockford并不是可以消化的,并且经常会宣称一些真正属于品味的东西(如果陈述的话,就像一行一样)与同样的权威是坏的,他说真正可怕的事情是坏的(就像整个隐含的全局/显式本地事物一样)。

with的问题在mdc页面上解决

1
2
3
4
 function f(x, o) {
  with (o)
    print(x);
 }

基本上,x的值在运行时才是模糊的。如果o有一个名为x的属性,则x将是该属性。如果没有,x将是传入的东西。这意味着阅读代码的开发人员可能很难搞清楚x的含义,更重要的是,JS解释器将无法应用某些类型的优化,否则它将能够至。


现在个人而言,我发现它具有完全可读性,并且我永远不会按照上面示例中的名称命名变量,因此我发现可读性和模糊性参数hogwash。至于perf参数,只要我们不是在谈论愚蠢(比如将你的应用程序放在一个带有块的一半),主要是过早优化的论据,你真正在谈论几乎无法估量的浪费时间。现实世界的场景。我认为这是一种高度情境化的语言特性,只有当替代方案要么明显更多,或者可读性较差的代码才能替代时,才能真正使用它。