2015-05-06 14 views
7

Ich versuche zu verstehen, wie sich jQuery selbst aufstellt.JQuery-Bibliothek Modul-Export

Gleich zu Beginn ruft jQuery automatisch eine Funktion auf, die ein Modul exportiert.

Wie funktioniert das Setup?

Hier einige detailliertere Unterfragen, die die die allgemeinere Frage beantworten könnten:

  • Was function(w) bei module.exports die Verwendung des rekursiven Aufruf ist?
  • Was nutzt die Variable noGlobal?
  • Wo ist die factory tatsächlich eingerichtet und was ist ihr Typ?
  • Warum kann das factory Argument mit einem Argument und mit zwei auch aufgerufen werden?
  • Was soll das global Argument enthalten? (Ich wünschte, es ist eine Art, wie in C++ war ...)

(function(global, factory) { 

    if (typeof module === "object" && typeof module.exports === "object") { 
     // For CommonJS and CommonJS-like environments where a proper `window` 
     // is present, execute the factory and get jQuery. 
     // For environments that do not have a `window` with a `document` 
     // (such as Node.js), expose a factory as module.exports. 
     // This accentuates the need for the creation of a real `window`. 
     // e.g. var jQuery = require("jquery")(window); 
     // See ticket #14549 for more info. 
     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); 
    } 

    // Pass this if window is not defined yet 
}(typeof window !== "undefined" ? window : this, function(window, noGlobal) { 

Antwort

15

Was ist die Verwendung des rekursiven Aufrufs function(w) bei module.exports?

Es handelt sich nicht um einen rekursiven Aufruf, sondern eher um eine verzögerte Initialisierungsfunktion. In einigen CommonJS-Umgebungen wie Node.JS hat das globale Objekt keine document-Eigenschaft, während andere wie Browserify und Webpack dies tun.

jQuery benötigt die Eigenschaft document, um initialisiert zu werden. Daher wird zuerst überprüft, ob das globale Objekt eine document-Eigenschaft enthält. Wenn dies der Fall ist, wird es sofort initialisiert, wodurch die CommonJS-Umgebungen im Browser glücklich werden. Ist dies nicht der Fall, wird eine Funktion zurückgegeben, mit der jQuery später initialisiert werden kann. Diese Funktion könnte später in einem gefälschten Fenster aufgerufen werden und mit etwas wie jsdom erstellt werden.


Was ist die Verwendung des noGlobal Variable?

Hier wird die noGlobal Variable verwendet.

Excerpt from jQuery:

// Expose jQuery and $ identifiers, even in 
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 
// and CommonJS for browser emulators (#13566) 
if (typeof noGlobal === strundefined) { 
    window.jQuery = window.$ = jQuery; 
} 

Wesentlichen, wenn noGlobalundefined ist, wird jQuery selbst window Objekt zum globalen hinzuzufügen. Dies wird nur dann nicht ausgeführt, wenn es von einem CommonJS-Loader mit einer document-Eigenschaft für das globale Objekt, wie z. B. Browserify oder Webpack, geladen wird. Der folgende Anruf lautet: noGlobal ist nicht undefined.

factory(global, true) 

Wo ist der factory gesetzt tatsächlich und was ist seine Art?

Die factory Variable ist ein function, und es wird hier erklärt:

function(window, noGlobal) { 

Es ist das zweite Argument in die IIFE geben.


Warum kann das factory Argument mit einem Argument und mit zwei als auch genannt werden?

Weil JavaScript.

In JavaScript muss die Anzahl der Argumente, mit denen eine Funktion deklariert ist, nicht übereinstimmen. Alle ausgelassenen Argumente haben den Wert undefined.


Was ist das global Argument soll enthalten? (Ich wünschte, es gäbe einen Typ wie in C++ ...)

Es soll das globale Objekt für die JavaScript-Umgebung enthalten. In einem Browser ist dieses Objekt als window bekannt, und in Node ist dieses Objekt als global bekannt. In beiden Umgebungen wird die Verwendung von this im globalen Gültigkeitsbereich in das globale Objekt aufgelöst, unabhängig vom globalen Namen.

Aufgrund einiger Wrapper von Drittanbietern, die den Bereich ändern können, in dem jQuery initialisiert wird, überprüft jQuery zunächst, ob das Objekt window verfügbar ist, und verwendet es, wenn dies der Fall ist. Wenn nicht verwendet, wird standardmäßig this verwendet.

typeof window !== "undefined" ? window : this 

noch eine Frage: wo das w Argument kommt?

Wenn das globale Objekt enthält keine document, gibt es eine Funktion, die ein Argument akzeptiert, die w. Dieses Objekt wäre ein window ähnliches Objekt mit einer document, die mit etwas wie jsdom erstellt werden kann.

+0

eine weitere Frage: Woher kommt das w-Argument? – Beginner

+0

@Beginner Wenn das globale Objekt kein 'Dokument' enthält, gibt es eine Funktion zurück, die ein Argument, das' w', akzeptiert. Dieses Objekt wäre ein "Fenster" -ähnliches Objekt mit einem "Dokument", das mit etwas wie jsdom erzeugt werden kann. –

+0

Bedeutet dies, dass w eine globale Variable ist, die verfügbar ist, wenn kein Dokument verfügbar ist? – Beginner