2012-09-27 37 views
0

下面的代碼是從實施例「實施例通過第二版的JavaScript」 15.24
我不理解的代碼VAR EVT = E || window.event; //瀏覽器的差異
我認爲VAR EVT應該是真的還是假的,所以evt.target爲空,對不對?邏輯關鍵字||只有值是真或假?

function colorText(e){ 
    var evt = e || window.event; //Browser differences 
    var evtTarget= evt.target || evt.srcElement; 
    if(evtTarget.id=="first"){ 
div1.className="red"; 
} 
else if(evtTarget.id == "second"){ 
div2.className="blue"; 
} 
else{ div3.className="green";} 
} 
+0

的[可能重複做&&和||運營商將它們的操作數布爾(http://stackoverflow.com/questions/7601962/do-the-and-operators-convert-their-operands-to-booleans) – Bergi

回答

1

關鍵字 表達,如果它不是空 falsey,第二的,否則的值返回第一個 表達 操作數的值。

JavaScript是弱類型化,所以你可以隨時使用||作爲布爾值,因爲所有不是false或null的結果都是true。但它實際上在這裏返回值,s 。所以evt變爲:e(參數),或者如果e 不存在 有falsey值,就window.event

1

不,在JavaScript中||不會強制轉換爲布爾值,而是會短路到哪個值(從左到右)首先評估爲truthy。

它保留了表達的評價。

2

如果沒有設置e,表示您沒有使用參數調用該函數,則evt將爲window.event。如果e設置,然後evt將是什麼e是。

有一個概念被稱爲short circuit evaluation,這意味着如果條件滿足,但沒有完全評估它,那麼它不需要完全評估它。這是這種情況。如果e設置,你不在乎什麼window.event是,因爲你已經擁有的東西,你可以設置evt來。

+0

問:你是怎麼想出來的代碼塊格式到與你的句子的其餘部分保持一致?此外,codeblock格式化文本的語法看起來像一個命令是什麼? – L0j1k

+0

將文本包裹在反引號中。查看[編輯幫助](http://stackoverflow.com/editing-help)瞭解更多信息。 – sachleen

1
var evt = e || window.event; 

如果e不爲空,該行將變量evt設置爲e。否則(如果e爲null,例如,如果e未傳遞給此函數),則evt設置爲window.event。

4

所有的答案到目前爲止在技術上是正確的。完整的故事:

的||如果將其轉換爲布爾值的結果爲真,則返回第一個操作數的值。否則,它返回第二個操作數的值。 ES5 Spec

許多不同的價值觀是 「falsy」,包括null和undefined。 Nailing down exactly what falsy is can be tricky,但你可以指望這些,這對捕獲可能不存在於不同瀏覽器中的變量和屬性很有用。如果你想自己檢查未定義的變量,那麼通常最好使用typeof來代替。