2011-02-17 50 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>

相關問題