2012-06-18 35 views
-1

今天我看到這個代碼,這是在Node.js的環境中運行。 (> node.exe test.js)node.js的異常行爲

var param = (typeof module !== "undefined" && module.exports) || {}; 

(function(exports){ 

    console.log(exports === module.exports); 

})(param); 

並且此日誌返回true。

任何人都可以解釋我這樣的行爲?

在此先感謝。

+2

什麼是你期待? – Sarfraz

+0

嗯,也許是錯的,但我認爲((typeof運算模塊..)|| {})將返回true,而不是「出口」對象 – bonbonez

回答

3

如果module不是未定義(這不是因爲它是默認對象)和module.exports是truthy事情(它是通過缺省值),然後exports被分配給param並傳遞給函數。

exports然後與module.exports進行比較,它們是相同的,因爲module.exports是對象來自的地方。

exports不會是一樣module.exports如果它是運行在其他地方(例如,你在哪裏得到window瀏覽器,而不是module),因爲{}將被分配到param代替。)


再更新關於這個問題的評論:

嗯,也許這是錯誤的,但我認爲((typeof模塊..)|| {})將返回true,但不是「exports」對象

&&將(作業從左到右)作爲測試的第一個虛假事物或(如果一切都是真實的)評估它測試的最後一個真實事物。

typeof module !== "undefined"所以測試module.exports,所以它返回module.exports這也是真實不虛。

(該||回到它測試,所以它然後返回module.exports第一truthy或最後falsey東西)

+0

嗯..我真的以爲是編譯器做的第一件事就是轉化子表達式(typeof param =='undefined',module.exports),然後比較轉換後的值,最後返回結果(在本例中爲true && true = true)。這是我的史詩般的失敗。非常感謝你。 – bonbonez

2
var d = (a && b) || c 

d評估爲b如果a是真實的。如果a是假的,d評估爲c