2017-05-31 3 views
1

Ich versuche, in den src-Code von jQuery zu tauchen, und gleich am Anfang des src-Code in der Entwicklungsversion (3.2.1) von jQuery finden wir:Javascript des ternäre Operator semantischer

(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); 
} 

Soweit ich weiß, weiß ich, dass ternärer Operator nach einer bestimmten Bedingung kommt, aber hier kommt er nach einem Zuweisungsoperator module.exports = global.document ?. Könnten Sie das erklären? Was macht es im Zusammenhang mit dem vorherigen Code?

+2

Ternärer Operator geht nach allem wirklich. Wenn es kein Boolescher Wert ist, wird es als solcher konvertiert. Wenn also global.document null oder undefined oder "" oder ein anderer falscher Wert ist, wird es als false betrachtet und wenn nicht, true – juvian

+1

Das heißt, wenn global.document true ist, dann wird module.exports global.document zugewiesen. Wenn global.document falsy ist, wird die Funktion (w) dem Modul zugewiesen.Exporte, die exportiert werden – Chris

+0

Mögliche Duplikate von [Wie verwenden Sie die? : (Bedingter) Operator in JavaScript?] (https://stackoverflow.com/questions/6259982/how-do-you-use-the-conditional-operator-in-javascript) – juvian

Antwort

4

Mit dem ternären Operator können zwei Ausdrücke bedingt ausgewertet werden (der erste im Falle der Bedingung ist wahr, der zweite im anderen Fall).

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); 
     }; 

Die Zuordnung bedeutet, dass das Ergebnis der Bedingungsauswertung module.export zugeordnet ist.

Der ternäre Operator ist ein syntaktischer Zucker und funktioniert wie folgt:

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

so können Sie den Code übersetzen:

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); 
     }); 

Bitte beachten Sie:

factory(global, true) 

und

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

Sie sind beide Ausdrücke: das Ergebnis der Aktivierung der factory-Funktion ist ein Ausdruck; Die Definition eines Funktionswerts ist ebenfalls ein Ausdruck.

Verzögerte Auswertung

Die Funktion ternary_operator einen eifrig ternären Operator zur Verfügung stellt. Die Ausdrücke werden innerhalb der Bedingung ausgewertet, und dann wird einer von ihnen zurückgegeben. Zum Beispiel:

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 ternärer Operator ist faul: das bedeutet, dass die Bedingung zuerst ausgewertet wird, dann eine gerade von dem anderen Ausdruck evaluatued ist, in Bezug auf Leistung zu gewinnen.

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; 

In diesem Fall wird der ternäre Operator sucht nicht nach a = b sondern für b. Das liegt daran, dass der Zuweisungsoperator aus gutem Grund eine höhere Operatorvorabständigkeit als der ternäre Operator hat.

(a=b)?c:d; 

In diesem Fall wird der ternäre Operator testet wirklich für a = b. In diesem Fall speichert b in a und gibt diesen Wert zurück.

Verwandte Themen