2016-03-23 2 views
0

Ich lese Codebeispiel von hereSchlüsselwort THIS in Javascript als globalen Namensraum

Sie werden feststellen, dass es IIFE in Javascript ist. Nachdem ich einige Dokumentationen gelesen habe, verstehe ich jetzt gut, was es ist und wie es auf einfache Weise funktioniert.

Aber am Ende dieses Skripts, es geht „dieses [‚routingConfig‘]“

(function(exports){ 

    // Other codes 
    exports.userRoles = buildRoles(config.roles); 
    // Other codes and definition of buildRoles 

})(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports); 

Dann scheint es, dass wir auch in anderen Skriptdateien es wie folgt direkt aufrufen:

var access = routingConfig.userRoles; 
so

was ist die genaue Verwendung von

(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports); 

Es scheint, dass ‚dies‘ Schlüsselwort als globalen Namespace funktioniert, fügen Sie ‚r outingConfig 'als Schlüssel-Wert-Paar.

+0

Wenn Sie die Konsole öffnen und nur 'this' eingeben, sehen Sie Fenster, das global ist. – dannyjolie

Antwort

4

Diese Codezeile:

(typeof exports === 'undefined' ? this['routingConfig'] = {} : exports); 

Bevorstehende letztlich zu entscheiden, was mit dem IIFE als erstes Argument übergeben.

  1. Wenn exports im aktuellen Bereich definiert ist, dann wird es exports passieren.
  2. Wenn exports nicht definiert ist, initialisiert es this['routingConfig'] zu einem leeren Objekt und übergibt das leere Objekt als erstes Argument.

Wenn routingConfig.userRoles im Code zugänglich anderswo ist, dann ist das, weil this['routingConfig'] ist eine Eigenschaft auf einem Objekt (was auch immer this Punkte in diesem Code) einstellen und das Objekt ist offenbar zugänglich an anderer Stelle in Ihrem Code.

Es ist möglich, dass this auf das Objekt global zeigt, aber wir müssten den gesamten Zusammenhang des Codes sicher wissen. Wenn es auf das globale Objekt zeigt, könnte dies erklären, warum es von anderen Stellen in Ihrem Code aus zugänglich ist.


Ich persönlich schreibe nie Code, this ist das globale Objekt einnimmt. Wenn ich auf das globale Objekt verweisen möchte, beziehe ich mich direkt darauf. Dann wird jeder, der Ihren Code betrachtet, genau wissen, was der Code beabsichtigt, ohne sich zu fragen, was auf this gesetzt ist.

Meine Verwendungen von this sind fast ausschließlich entweder das Host-Objekt in einem Methodenaufruf oder etwas, das spezifisch über die Dokumentation eingestellt wird, wenn eine Callback-Funktion wie .addEventListener() für DOM-Ereignisse aufgerufen wird. Dies macht es viel klarer aus dem Kontext des lokalen Codes, was auf this gesetzt ist.