2011-02-17 48 views
1

可能重复:
Are there legitimate uses for JavaScript's “with” statement?是javascript中的关键字不好吗?

“的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

`with`不改变`this`指针。你有什么问题? – 2011-02-17 02:44:55

回答

1

with的问题在于它在做什么时有点模棱两可。例如,您的foof()函数调用也可能是其他地方定义的函数。一目了然地看到使用什么是很难的。

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%的情况。根据具体情况采取措施是一种更好的做法,并问问自己,如果您编写的代码清晰可读,然后禁用某些内容,因为在极端情况下,您可以用它做出糟糕的事情。这是说,我想不出一个情况下,我会使用嵌套。无论如何,这个问题的描述很好,+1 – 2011-02-17 03:26:05

0

我可以举个例子,约翰resigs简单(广受欢迎) client side templating function.

<editorial>
好的部分是一本改变人生的惊人书,但克罗克福不是不可忽略的,而且往往会声明一些真正关乎品味的东西(比如一条语句)是否与他说的真正可怕的东西是不好的(就像整个隐式的全局/显式的本地事物一样)。
<editorial>

with的问题是MDC页面

function f(x, o) { 
    with (o) 
    print(x); 
} 

上基本上解决,x的值是模糊的,直到运行时间。如果o有一个名为x的属性,x将是该属性。如果不是这样,那么x就是通过的东西。这意味着开发人员阅读代码可能很难弄清楚x的含义,更重要的是,JS解释器将无法应用某些种类的优化,否则它将能够至。

<opinion>
现在就个人而言,我发现完全可读,我会永远命名变量,他们在上面的例子中的命名方式,所以我觉得可读性和模糊参数一派胡言。至于perf这个论点,只要我们不是在讨论是否愚蠢(比如在一个block中有一半的应用),大多数情况下这是一个过早优化的论点,在那里你真的在谈论几乎无法估量的浪费时间真实世界的场景。我认为这是一种高度情境化的语言功能,应该只有在备选方案要么更多时才真正使用,要么可读性更差的代码将成为备选方案。
</opinion>

相关问题