Bedeutung von "dieses" in node.js Module und Funktionen
Habe ich eine JavaScript-Datei, die geladen wird, indem require
.
//loaded by require()
var a = this; //"this" is an empty object
this.anObject = {name:"An object"};
var aFunction = function() {
var innerThis = this; //"this" is node global object
};
aFunction();
(function(anyParameter){
console.log(anyParameter.anObject);
})(
this //"this" is same having anObject. Not "global"
);
Meine Frage ist: this
im var a = this;
ist ein leeres Objekt in der Erwägung, dass this
Anweisungen in Funktionen sind Schatten node.js Globale Objekt. Ich weiß this
Schlüsselwort verschiedenen Funktionen, aber ich konnte nicht verstehen, warum die ersten this
ist nicht gleich global und this
Funktionen gleich global.
Wie funktioniert node.js injizieren global
zu this
in Funktion Bereiche, und warum es nicht injizieren, um die Modul-Bereich?
Der Wert von
Haben Sie einen Blick auf diese Frage.
Ich weiß, warum sich zwei
Wie nennt man
Dokument, das Sie zeigte, gab viel mehr Einblick über
this
ist bestimmt als eine Kern-Funktion der JavaScript-Sprache selbst (obwohl NodeJS kann, setzen Sie den Wert über die Sprachelemente von JavaScript). Möglicherweise müssen Sie Lesen, bis auf einige this
docs. Beachten Sie, dass die docs in der Regel davon ausgehen, das JS ist im browser ausgeführt wird, so das "Globale Objekt" wird window
statt der NodeJS-global-Objekt, aber die Konzepte sind die gleichen. Einige weitere relevante Dokumente sind NodeJS ist this
docs.Haben Sie einen Blick auf diese Frage.
Ich weiß, warum sich zwei
this
Werte unterschiedlich sind. Meine Frage ist, warum und wie node.js injiziert global
zu this
im Funktions-Bereich, nicht auf den äußeren Umfang. Es kann Spritzen global
sowohl this
'es zu halten Sie anders.Wie nennt man
aFunction
?Dokument, das Sie zeigte, gab viel mehr Einblick über
this
Dank. Wie ich verstanden habe this
wird anders, je nachdem wo die Funktion aufgerufen wird. Aber immer noch konnte ich nicht herausfinden, warum und wie node.js injiziert global
in unterschiedlicher Weise. Hinweis: ich habe call für aFunction
wie wenn ich debuggt.InformationsquelleAutor Gökçer Gökdal | 2014-03-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ein paar grundlegende Fakten, die Sie verstehen müssen, um die situation zu klären:
In der top-level-code in einem Node-Modul
this
entsprichtmodule.exports
. Das ist das leere Objekt, das Sie sehen.Wenn Sie
this
innerhalb einer Funktion, wird der Wert vonthis
wird neu entschieden, bevor jede und jeder Ausführung der Funktion, und der Wert ist bestimmt durch wie die Funktion wird ausgeführt. Dies bedeutet, dass zwei aufrufen der gleichen Funktion Objekt kann verschiedenethis
Werte, wenn die Aufruf-Mechanismen unterschiedlich sind (z.B.aFunction()
vs.aFunction.call(newThis)
vs.emitter.addEventListener("someEvent", aFunction);
usw.) In deinem FallaFunction()
im nicht-strict-Modus läuft die Funktion mitthis
setzen auf das Globale Objekt.Wird, wenn der JavaScript-Dateien sind
require
d als Knoten-Module, die Knoten-Modul führt das Modul-code innerhalb einer wrapper-Funktion. Das Modul-wrapping-Funktion aufgerufen wird, mit einemthis
eingestelltmodule.exports
. (Man erinnere sich vor, eine Funktion kann ausgeführt werden mit eine frei wählbarethis
Wert.)Somit erhalten Sie unterschiedliche
this
Werte, weil jederthis
befindet sich in einer anderen Funktion: der erste ist in der Node-Modul erstellt-wrapper-Funktion, und die zweite ist innerhalb deraFunction
.apply
Methode alsreturn compiledWrapper.apply(self.exports, args);
. Vielen Dank an alle für all Ihre Hilfe.InformationsquelleAutor apsillers
Um dies zu verstehen, müssen Sie verstehen, dass Node.js tatsächlich umschließt deinen Modul-code in einer Funktion, wie dies
Ausführliche Erläuterung finden Sie in diese Antwort.
Nun, verpackt Funktion ist tatsächlich aufgerufen wird, wie dies
So
this
auf der Modul-Ebene, ist das eigentlich dieexports
Objekt.Können Sie bestätigen, dass, wie dies
test
werden könnten, auf unterschiedliche Weise aufgerufen, Einstellungthis
etwas anderesVon dem was ich verstehe durch aufrufen einer Funktion wie
fn()
machenthis
Punkt auf das Globale Objekt, oder null, wenn mituse strict
hat, ist es egal, was die aktuellethis
ist... ist der Knoten unterscheidet sich von dem browser, wenn es um die Festlegungthis
? Ich denke, die richtige Antwort ist nur, dass das Globale Objekt wird festgelegt, umexports
Pflege Kommentar zu meinem Kommentar (und meine Antwort?), Ich denke, deine Antwort ist irreführend, da der Wert, wo test() aufgerufen wird, hat keine Auswirkung auf den Wert von this innerhalb von test(), es geht darum, wie es heißt. Ich würde gerne verstehen, wenn ich etwas fehlt
InformationsquelleAutor thefourtheye
Zusammenfassung:
In Javascript den Wert
this
ist bestimmt wenn eine Funktion aufgerufen wird. Nicht, wenn eine Funktion erstellt wird. In nodeJS in der äußersten Umfang eines Moduls der Wertthis
ist die aktuellemodule.exports
Objekt. Beim Aufruf einer Funktion wird als Eigenschaft von einem Objekt der Wert dieser änderungen auf das Objekt es aufgerufen wurde. Sie sich erinnern können dies einfach durch die Links-of-the-dot Regel:Vorsichtsmaßnahmen:
es2015
Pfeil-Funktion, die nicht Ihre eigenen Bindung vonthis
.call
,apply
, undbind
können, biegen Sie die Regeln für diethis
Wert.Beispiel (NodeJS):
Ausgabe:
InformationsquelleAutor Willem van der Veen
Es ist, weil der Globale Standard-Objekt in einem Node.js Modul ist die
exports
Objekt, und Sie rufentest()
die nicht angebenthis
. In der traditionellen JS,this
Punkte auf das Globale Objekt, mituse strict
,this
null.this
zeigen können, alles, es hängt nur davon ab, wie Sie es nennen.test()
: Verwendet das Globale Objekt (exports
)this
, es sei denn im strikten Modus, wothis
null;test.call({})
odertest.apply({})
: geben Sie an, was zu verwenden, wiethis
(der erste parameter)var obj = {testRef: test}; obj.testRef()
:this
eingestellt ist auf der linken Seite der.
, dassobj
Bekämpfung thefourtheye Antwort
Es ist wahr, dass
this
in der obersten Ebene des Moduls istexports
, aber das bedeutet nicht unbedingt, dassthis
innentest()
wird auch Punkt-zu-gleiche Sache wie, wo es hieß aus.Versucht zu beweisen, dass
this
und das Globale Objekt verweisen beide aufexports
this
Punkte zuglobal
im REPL - Modus nurglobal object in Node.js is the exports object
- Es ist nicht richtig. Jedes Modul hat seine eigeneexports
Objekt.Danke, das ist, warum ich fragte, lief ich in meinem test von der Befehlszeile aus
Ich habe sammeln, die aus der Dokumentation, bedeutet das, dass es keine globals? In meinem Beispiel oben, würde myGlobal es nicht in ein anderes Modul?
globals existieren in Knoten, aber im Gegensatz zu client-side JS, sollten Sie den Zugriff
global
Objekt. Zum Beispielglobal.myName = 'Mike';
gesehen werden in allen Modulen überglobal.myName
oder nurmyName
. Abervar myName = 'Mike';
odermyName = 'Mike'
ist nur im aktuellen Modul. Werfen Sie einen Blick auf die docsInformationsquelleAutor Juan Mendes