2012-03-25 84 views
4

有一次,我看到了這樣一個例子:可以用()嗎?

var a, x, y; 
var r = 10; 
with (Math) { 
    a = PI * r * r; 
    x = r * cos(PI); 
    y = r * sin(PI/2); 
} 

而且看起來很方便,因爲這樣我就不必鍵入所有Math.秒。

但是當我看看的MDN,它說:

不建議使用with,並且是在ECMAScript中5嚴格模式禁止的。建議的替代方法是將要訪問其屬性的對象分配給臨時變量。

那麼可以使用with()嗎?在HTML5

+0

定義「好」。如果你的意思是「推薦」,那麼就沒有(至少有一個好的來源),並且你引用了證據。如果你的意思是「它會工作」,那麼也許,這取決於你是否使用嚴格模式。 – Quentin 2012-03-25 21:05:57

+3

這個問題不值得投票 – Ben 2012-03-25 21:07:25

+2

BTW HTML 4或5是不相關的。 Javascript/ECMAScript不是HTML的一部分。 – 2012-03-25 21:21:52

回答

4

您所連結的MDN說:Using with is not recommended ...
with是做麪條代碼爲午餐的好方法。

你可能會喜歡它,但那些需要調試它的人會詛咒你。

javascript有一些非常奇怪的操作符,如逗號運算符(,)。
你能理解下面的代碼是做什麼的嗎?

var a = "a"; 
var b = "b"; 
a = [b][b = a,0]; 

那麼它交換a和b ...你不明白,,從而將需要保持你的with代碼的人。不要使用黑客,黑客在charades遊戲中很酷,而不是真正的代碼。


When is the comma operator useful?
The comma swap Fiddle

+0

什麼?o.O什麼'a = [b] [b = a,0];'做什麼? – 2012-03-25 21:14:22

+0

我不明白...'[b] [b = a,0]'wtf ...是嗎? – 2012-03-25 21:18:11

+1

@Derek。檢查更新的小提琴。它交換'a'和'b'。現在你明白我爲什麼了嗎?黑客很酷,但不是真正的代碼! – gdoron 2012-03-25 21:18:48

3

只要您理解它,就可以使用JavaScript的任何功能,

例如,使用with您可以訪問對象的現有屬性,但無法創建新的。

觀察:

var obj = {a:1,b:2}; 
with(obj) { 
    a = 3; 
    c = 5; 
} 
// obj is now {a:3,b:2}, and there is a global variable c with the value 5 

它可以是縮短的代碼,如有用:

with(elem.parentNode.children[elem.parentNode.children.length-3].lastChild.style) { 
    backgroundColor = "red"; 
    color = "white"; 
    fontWeight = "bold"; 
} 

由於style對象的屬性已經存在。

我希望這個解釋夠清楚。

+4

「只要你理解它,就可以使用任何JavaScript特性。」 ...並且是唯一一個永遠保持它的人。 – Quentin 2012-03-25 21:06:34

+0

@Quentin。有趣的是,我只是在我的回答中添加了這種評論。 **大聲笑** – gdoron 2012-03-25 21:07:36

+0

但爲什麼他們不推薦'with()'? – 2012-03-25 21:08:22

2

在他的優秀著作 「的Javascript:好的部分」,道格拉斯克羅克福德列出了 「與聲明」 附錄B:壞的部件。

他說:「不幸的是,它的結果有時是不可預測的,所以應該避免它」。

他繼續舉例說明,其中with中的賦值將根據對象是否已定義而對不同的變量進行操作。

請參閱With statement considered harmful(但不如本書中的解釋詳細)。