2010-03-29 60 views

回答

22

它增加了包含在塊中的語句範圍:

return sObj.options[selectedIndex].value; 

可以成爲:

with (sObj) 
    return options[selectedIndex].value; 

在你的情況下,好好嘗試一下做了一大堆。 ..但考慮以下內容:

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

成爲:

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

...保存了幾個按鍵。 Mozilla的文件確實會更詳細一點解釋的事情(有優點和使用它的利弊一起)的一個不錯的工作:

with - Mozilla Developer Center

+0

Lame的用法,就像在VBA中一樣。在Python中可以照顧清理一次性對象。在C#中,它被稱爲using。 – 2010-03-29 13:58:48

+0

+1 - 嘿賈斯汀 - 尼斯解釋 – 2010-03-29 14:22:07

+0

@Mark - 謝謝。看起來我應該包括'建議不要使用這個'條款。 – 2010-03-29 18:31:04

1

我會建議不要使用,因爲性能問題,這一點,但什麼上面的意思是:

對於對象sObj(這裏可能是一個select元素),在這個(或下面的大括號之間)引用的所有子元素和屬性都把它當作它們的父範圍。

1

它不是一個函數(如在編輯之前的問題標題中指出的那樣),而是一個聲明。它可能更有意義,如果代碼樣本被格式化,像這樣:

with (sObj){ 
    return options[selectedIndex].value; 
} 

關於它做什麼(Source

with語句建立了一組語句的默認對象。 JavaScript在語句集合內查找任何非限定名稱,以確定名稱是否是缺省對象的屬性。如果一個非限定名稱與一個屬性相匹配,那麼該屬性將在語句中使用;否則,使用本地或全局變量。

這意味着在代碼示例中,首先檢查options是否爲sObj的屬性。如果是則optionssObj.options,否則它會檢查其他範圍由名稱options

使用with聲明的缺點定義的變量是,它是不可能從什麼被訪問的代碼只是一眼就知道了。還有其他更好的選擇,如圖this article

+0

雖然你的答案的其他答案是正確的,但格式化相對較少用它。 – belugabob 2010-03-29 14:02:00

+0

@belugabob請*閱讀*答案,而不是猜測其內容。我從來沒有提到格式與「with」語句有任何關聯。我說,如果它使用大括號進行格式化,它會使*看起來更像一個函數調用,更像一個聲明。 – Yacoby 2010-03-29 14:04:00

+0

@belugabob我也重新排列了單詞順序,使其更難以誤解。 – Yacoby 2010-03-29 14:09:58

2

在與你沒有輸入塊:

sObj.options[selectedIndex].value 

,但你可以使用:

options[selectedIndex].value 
2

相當於
return sObj.options[selectedIndex].value; 

With可讓您在競賽中發出一個語句塊xt特定對象。因此,with塊中的所有語句都被視爲括號中對象的成員。

這可以使代碼的時候,它也能引起歧義更易讀,因爲變量引用可以是與sObj或全局。

legitimate uses for javascript's "with" statement:d

9

with說法是純粹的語法糖,但它也可能會導致一些討厭的錯誤。

澄清見with Statement Considered Harmful

如果您無法讀取程序,並有信心,你知道它是什麼要做的事情,你不能有信心,它會正常工作。因此,應避免使用with聲明。

+2

++提到'有'的缺點, – 2010-03-29 14:03:59

1

你的例子可以改寫爲...

return sObj.options[selectedIndex].value; 

...作爲供應對象的範圍with語句將所有相關的聲明。在這種情況下,這是非常沒有意義的,但是,如果你在'Obj'上做了很多操作,那麼它會節省很多輸入。

完全虛構的例子..

with (sObj) 
{ 
    if(options[selectedIndex].value < 10){ 
     options[selectedIndex].value++; 
     total+ = options[selectedIndex].value; 
    } 
} 

不過,話雖如此,它往往是節省打字可以用更好的方式來實現的情況。