2017-05-31 24 views
1

我試圖潛入的jQuery的src代碼,並在該的SRC代碼的jQuery的開發版本(3.2.1)一開始,我們發現:JavaScript的三元操作語義

(function(global, factory) { 
"use strict"; 
if (typeof module === "object" && typeof module.exports === "object") { 
    module.exports = global.document ? 
     factory(global, true) : 
     function(w) { 
      if (!w.document) { 
       throw new Error("jQuery requires a window with a document"); 
      } 
      return factory(w); 
     }; 
} else { 
    factory(global); 
} 

就我的知識而言,我知道三元運算符是在一定條件之後出現的,但在這裏它是在賦值運算符module.exports = global.document ?之後出現的。你能解釋一下嗎?它在前面的代碼中做了什麼?

+2

三元運營商真的追求什麼。如果它不是布爾值,它將被轉換爲這樣。因此,如果global.document爲null或未定義或「」或任何其他falsy值,它將被視爲false,如果不是,則爲true – juvian

+1

這意味着如果global.document爲true,則module.exports將被分配global.document。如果global.document是虛假的,則將函數(w)分配給模塊。正在輸出的出口 – Chris

+0

[您如何使用? :JavaScript中的(條件)運算符?](https://stackoverflow.com/questions/6259982/how-do-you-use-the-conditional-operator-in-javascript) – juvian

回答

4

三元運算符允許有條件地評估兩個表達式(如果條件爲真,則爲第一個,否則爲第二個)。

module.exports = global.document ? 
     factory(global, true) : 
     function(w) { 
      if (!w.document) { 
       throw new Error("jQuery requires a window with a document"); 
      } 
      return factory(w); 
     }; 

的分配意味着,條件評估的結果被分配給module.export

三元運算符是一個語法糖和工作原理是這樣的:

function ternary_operator(condition, expression1, expression2) { 
    if (condition) { 
     return expression1; 
    } else { 
     return expression2; 
    } 
} 

這樣你就可以轉化代碼:

module.exports = ternary_operator(global.document, 
     factory(global, true), 
     function(w) { 
      if (!w.document) { 
       throw new Error("jQuery requires a window with a document"); 
      } 
      return factory(w); 
     }); 

請注意:

factory(global, true) 

and

function(w) { 
     if (!w.document) { 
      throw new Error("jQuery requires a window with a document"); 
     } 
     return factory(w); 
    }; 

它們都是表達式:factory函數的激活結果是一個表達式;函數值的定義也是一個表達式。

惰性求

功能ternary_operator提供急於三元運算符。表達式在條件內被評估,然後返回其中的一個。例如:

var l = ternary_operator(C, A, B); 
1. evaluate C 
2. evaluate A 
3. evaluate B 
4. activate function ternary_operator 
5. assign to l the result of the function 

的Javascript三元運算符是懶:這意味着,條件首先進行評價,則evaluatued其他表達的只有一個,在性能方面獲得。

var l = C ? A : B; 
1. evaluate C 
2.1 if C is true evaluate A 
2.2 if C is false evalutate B 
3. assign to l the expression evaluated 
1
a=b?c:d; 

在這種情況下,三元運算符不檢查A = B而是用於b。那是因爲賦值運算符比三元運算符具有更高的運算符前級,這是有原因的。

(a=b)?c:d; 

在這種情況下,三元操作確實測試對於A = B。在這種情況下,它會將b存儲在a中並返回此值。