2012-09-09 64 views
11

這似乎工作,是有效的,但有沒有什麼理由我不應該這樣做?它爲我節省了一行代碼,並讓我設置一個變量和一個文本區域的值。val設置變量

$('#price').val(default_price = 2.9); 

這是相同的:

default_price = 2.9; 
$('#price').val(default_price); 

回答

18

它嵌入代碼做內部代碼做一些完全不同的一兩件事。

特別是如果您在談論默認值,「常量」等,將初始化與UI交互相混淆會導致混淆。保持他們分開–更容易找到和維護。

技術上這是一回事。 認知它不是。

o.v.引發全球命名空間污染的幽靈。通過在任意位置聲明變量,可以增加覆蓋值的可能性,強調標識符,重複工作等等。

除了創造難以分離的錯誤,這是一個額外的認知負荷,因爲你就必須瞭解聲明的變量的範圍,找到其他可以使用等

+7

我也在這裏投兩行。不要將易於理解或維護的簡單寫作(單行)混淆。瞭解其他人對你的代碼的理解很重要。保持代碼易於維護對每個人都更好。 – Gilbert

+0

我不知何故選擇了RTL'ing代碼的習慣,尤其是在向同事解釋某事時 - 我更關心全球範圍內的污染等。 –

+0

嗯。感謝編程理論方面的小小教訓。 – northamerican

3

我不會在你的方式使用它 - 因爲我總是喜歡對象,以奇異值存儲爲一個集合,即:

var defaults = { 
    "price" : 2.9 
}; 

(這樣做的原因是,它是更導出,更加便攜,並且使用JavaScript無法正確刪除var可以一旦創建 - 而你可以刪除儘可能多的密鑰從一個對象,只要你喜歡)

但是,我確實使用你在做的很多,在if statements。有很多編碼器會抱怨它,但對我來說,將一些東西的結果分配給一個變種 - 然後測試它的存在 - 然後在相同的情況下使用它們是非常有意義的,在我眼中,更可讀的代碼,一切都位於同一地區:

var view; 

if ((view = someClass.thatChecksAndLoads('a view'))) { 
    /// do something with the view 
} 

上面很適合,你必須讓你的view對象的多種方式的情況下,例如:

if ((view = someClass.thatChecksAndLoads('a view'))) { 
    /// do something with the view 
} 
else if ((view = anotherWay.toLoad('a view'))) { 
    /// do something here instead 
} 

由於一個側面說明 - 以防萬一有人想知道 - 我不只是爲n添加額外的括號原因在上面。如果在if語句中有一個單獨的'=',那麼很多JavaScript編譯器(以及ActionScript編譯器)將會抱怨/記錄錯誤。所有這些都是因爲他們試圖有幫助,因爲只要你的意思是'=='...通過將括號中的任務包括在內,這通常會繞過檢查,或者至少會阻止發出警告。

+0

+1,有趣,但:我幾乎肯定會採取不同的方法,並將行爲直接與視圖和/或加載機制相關聯。 (或者別的,取決於上下文。)像這樣的if/else語句通常會在我頭腦中設置警告鈴聲,我可能做錯了什麼,並且我可以用更具溝通性的方式來封裝行爲。 –

+0

你最後一段中的「JavaScript編譯器」是什麼意思?你在談論IDE或其他開發工具嗎? (鑑於JS未被編譯部署,並且瀏覽器不會 - 也不應該 - 反對該構造。) – nnnnnn

+0

@nnnnnn道歉,JavaScript是一種解釋型語言(我有一種特定的方式來在輸入時不確定)...但是絕大多數當前的瀏覽器都會執行所謂的「JIT」或者即時編譯。這種影響是一樣的,無論試圖運行代碼都會觸發警告和錯誤(只需在任何瀏覽器中查看控制檯)。基本上,我擴展我的答案只是爲了在任何EMCAScript語言中都是安全的 - 並且爲了防禦對付括號的事情而對付ppl); – Pebbl

9

我會招待的想法這樣的結構可能是在某些情況下接受的,但不是這樣的一個特別是因爲有在給定的例子(最大的一個是「來自哪裏幻數」等文體問題)

IMO是,是否變量已被宣佈爲主要關注點 - 你不能簡單地

$('#price').val(var default_price = 2.9); //nope 

,如果原來的代碼與不變量尚未聲明中,你最終會污染全局範圍。但是,如果變量已經聲明瞭,它會提出一個後續問題「爲什麼它沒有用正確的默認值聲明」。可替代地,幻數可以根據第(未知)條件是不同的:

if (/*whatever*/) { 
    $('#price').val(default_price = 2.9); 
} else { 
    $('#price').val(default_price = 9522); //over 9000 
} 

再次,這是因爲設置#price值應該已經條件(或switch statment)以外執行文體差:

if (/*whatever*/) { 
    default_price = 2.9; 
} else { 
    default_price = 9522; 
} 
$('#price').val(default_price); 

有可能是其中變量設定器覆蓋,以返回比指定的值,它是擺在首位有點可疑做法的國際海事組織其他東西令人費解的情況。

+1

+1時,絕對是一個重大的主要問題。 –