Ich fragte hier: node.js erfordern Vererbung?
und mir wurde gesagt, dass ich Variablen auf den globalen Bereich setzen kann, indem ich die Variable weglasse.
Das funktioniert bei mir nicht.
dh:
_ = require('underscore');
Stellt das _ für die erforderlichen Dateien nicht zur Verfügung. Ich kann mit Express einstellen app.set
und habe es aber woanders verfügbar.
Kann jemand bestätigen, dass dies funktionieren soll? Vielen Dank.
javascript
node.js
express
Harry
quelle
quelle
exports
. Es ist viel viel besser.Antworten:
Sie können
global
wie folgt verwenden:quelle
window
ist das globale Objekt.document
ist eine Eigenschaft vonwindow
.Im Knoten können Sie globale Variablen über das Objekt "global" oder "GLOBAL" festlegen:
oder nützlicher ...
An der Knotenquelle können Sie erkennen, dass diese zueinander ausgerichtet sind:
Im obigen Code ist "dies" der globale Kontext. Beim commonJS-Modulsystem (welcher Knoten verwendet) ist das "this" -Objekt innerhalb eines Moduls (dh "Ihr Code") NICHT der globale Kontext. Zum Beweis siehe unten, wo ich das "this" -Objekt und dann das riesige "GLOBAL" -Objekt ausspucke.
** Hinweis: In Bezug auf die Einstellung "GLOBAL._" sollten Sie dies im Allgemeinen einfach tun
var _ = require('underscore');
. Ja, Sie tun dies in jeder einzelnen Datei, die Unterstriche verwendet, genau wie in Javaimport com.foo.bar;
. Dies macht es einfacher herauszufinden, was Ihr Code tut, da die Verknüpfungen zwischen Dateien "explizit" sind. Leicht nervig, aber eine gute Sache. .... das ist die Predigt.Zu jeder Regel gibt es eine Ausnahme. Ich hatte genau genau eine Instanz, in der ich "GLOBAL._" setzen musste. Ich habe ein System zum Definieren von "Konfigurations" -Dateien erstellt, die im Grunde JSON waren, aber "in JS geschrieben" wurden, um etwas mehr Flexibilität zu ermöglichen. Solche Konfigurationsdateien hatten keine "require" -Anweisungen, aber ich wollte, dass sie Zugriff auf Unterstriche haben (das GESAMTE System basiert auf Unterstrichen und Unterstrichvorlagen). Bevor ich die "config" auswerte, setzte ich "GLOBAL._". Also ja, für jede Regel gibt es irgendwo eine Ausnahme. Aber du solltest besser einen verdammt guten Grund haben und nicht nur "ich habe es satt, 'require' zu tippen, also möchte ich mit der Konvention brechen".
quelle
.js
Datei einfügen und aufrufen,require
bevor Sie die Konfigurationen exportieren?Die anderen Lösungen, die das Schlüsselwort GLOBAL verwenden, sind ein Albtraum für die Aufrechterhaltung / Lesbarkeit (+ Verschmutzung des Namespaces und Fehler), wenn das Projekt größer wird. Ich habe diesen Fehler oft gesehen und hatte die Mühe, ihn zu beheben.
Verwenden Sie eine JS-Datei und dann Modulexporte.
Beispiel:
globals.js
Wenn Sie diese verwenden möchten, verwenden Sie require.
quelle
globals.domain
?Wie wäre es mit einem globalen Namespace?
global.MYAPI = {}
Nach dem Kommentar von Camilo-Martin bearbeiten : Alle anderen Poster sprechen über das schlechte Muster. Abgesehen von dieser Diskussion ist der beste Weg, eine Variable global zu definieren (OP-Frage), Namespaces.
@tip: http://thanpol.as/javascript/development-using-namespaces
quelle
require
ist da! Es ist in Ordnung, Namespaces zu verwenden, aber nichtglobal.foo = global.foo || {}
alle Dateien oder ähnliches. Benötigen Sie die Datei, die den Namespace definiert. Tu es für die Kinder.Sie können einfach das globale Objekt verwenden.
quelle
Ich bin damit einverstanden, dass die Verwendung des globalen / GLOBAL-Namespace zum Festlegen von globalen Elementen eine schlechte Praxis ist und theoretisch überhaupt nicht verwendet wird ( theoretisch ist dies das operative Wort). Allerdings (ja, der Operative) verwende ich es zum Festlegen benutzerdefinierter Fehlerklassen:
Ja, hier tabu, aber wenn Ihre Site / Ihr Projekt überall benutzerdefinierte Fehler verwendet, müssen Sie diese grundsätzlich überall oder zumindest irgendwo definieren, um:
Das Definieren meiner benutzerdefinierten Fehler im globalen Namespace erspart mir den Aufwand, meine Kundenfehlerbibliothek zu benötigen. Imaging löst einen benutzerdefinierten Fehler aus, bei dem dieser benutzerdefinierte Fehler undefiniert ist.
Wenn dies auch falsch ist, lassen Sie es mich bitte wissen, da ich gerade erst damit begonnen habe
quelle