我看到了以with
開頭的JavaScript代碼。這有點令人困惑。它做什麼以及如何正確使用?JavaScript與JavaScript有什麼關係?
with (sObj) return options[selectedIndex].value;
我看到了以with
開頭的JavaScript代碼。這有點令人困惑。它做什麼以及如何正確使用?JavaScript與JavaScript有什麼關係?
with (sObj) return options[selectedIndex].value;
它增加了包含在塊中的語句範圍:
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的文件確實會更詳細一點解釋的事情(有優點和使用它的利弊一起)的一個不錯的工作:
我會建議不要使用,因爲性能問題,這一點,但什麼上面的意思是:
對於對象sObj(這裏可能是一個select元素),在這個(或下面的大括號之間)引用的所有子元素和屬性都把它當作它們的父範圍。
它不是一個函數(如在編輯之前的問題標題中指出的那樣),而是一個聲明。它可能更有意義,如果代碼樣本被格式化,像這樣:
with (sObj){
return options[selectedIndex].value;
}
關於它做什麼(Source)
with語句建立了一組語句的默認對象。 JavaScript在語句集合內查找任何非限定名稱,以確定名稱是否是缺省對象的屬性。如果一個非限定名稱與一個屬性相匹配,那麼該屬性將在語句中使用;否則,使用本地或全局變量。
這意味着在代碼示例中,首先檢查options
是否爲sObj
的屬性。如果是則options
指sObj.options
,否則它會檢查其他範圍由名稱options
使用with
聲明的缺點定義的變量是,它是不可能從什麼被訪問的代碼只是一眼就知道了。還有其他更好的選擇,如圖this article
在與你沒有輸入塊:
sObj.options[selectedIndex].value
,但你可以使用:
options[selectedIndex].value
其
相當於return sObj.options[selectedIndex].value;
With
可讓您在競賽中發出一個語句塊xt特定對象。因此,with
塊中的所有語句都被視爲括號中對象的成員。
這可以使代碼的時候,但它也能引起歧義更易讀,因爲變量引用可以是與sObj或全局。
的with
說法是純粹的語法糖,但它也可能會導致一些討厭的錯誤。
澄清見with Statement Considered Harmful:
如果您無法讀取程序,並有信心,你知道它是什麼要做的事情,你不能有信心,它會正常工作。因此,應避免使用
with
聲明。
++提到'有'的缺點, – 2010-03-29 14:03:59
你的例子可以改寫爲...
return sObj.options[selectedIndex].value;
...作爲供應對象的範圍with語句將所有相關的聲明。在這種情況下,這是非常沒有意義的,但是,如果你在'Obj'上做了很多操作,那麼它會節省很多輸入。
完全虛構的例子..
with (sObj)
{
if(options[selectedIndex].value < 10){
options[selectedIndex].value++;
total+ = options[selectedIndex].value;
}
}
不過,話雖如此,它往往是節省打字可以用更好的方式來實現的情況。
Lame的用法,就像在VBA中一樣。在Python中可以照顧清理一次性對象。在C#中,它被稱爲using。 – 2010-03-29 13:58:48
+1 - 嘿賈斯汀 - 尼斯解釋 – 2010-03-29 14:22:07
@Mark - 謝謝。看起來我應該包括'建議不要使用這個'條款。 – 2010-03-29 18:31:04