Ich habe eine JavaScript-Datei, die von require
geladen wird.
Meine Frage lautet: this
in var a = this;
ist ein leeres Objekt, während this
Anweisungen in Funktionen Schatten des globalen Objekts node.js sind. Ich weiß, dass this
keyword in Funktionen unterschiedlich ist, aber ich konnte nicht verstehen, warum zuerst this
nicht gleich global und this
in Funktionen gleich global ist.
Wie fügt node.js global
in this
in Funktionsbereiche ein und warum wird es nicht in den Modulbereich injiziert?
Hier sind ein paar grundlegende Fakten, die Sie verstehen müssen, um die Situation zu klären:
Im Code der obersten Ebene in einem Knotenmodul ist this
gleichbedeutend mit module.exports
. Das ist das leere Objekt, das du siehst.
Wenn Sie this
innerhalb einer Funktion verwenden, wird der Wert von this
erneut vor jeder einzelnen Ausführung der Funktion bestimmt und sein Wert ist bestimmt von wie die Funktion ausgeführt wird . Das bedeutet, dass zwei Aufrufe des exakt gleichen Funktionsobjekts unterschiedliche this
-Werte haben können, wenn die Aufrufmechanismen unterschiedlich sind (zB aFunction()
vs. aFunction.call(newThis)
vs. emitter.addEventListener("someEvent", aFunction);
, usw.) In Ihrem Fall aFunction()
Im nicht strikten Modus wird die Funktion mit this
auf das globale Objekt gesetzt.
Wenn JavaScript-Dateien require
d als Knotenmodule sind, führt die Knoten-Engine den Modulcode innerhalb einer Wrapper-Funktion aus. Diese Modul-Wrapping-Funktion wird aufgerufen, wenn this
auf module.exports
gesetzt ist. (Wie oben erwähnt, kann eine Funktion mit einem zusätzlichen this
-Wert ausgeführt werden.)
Sie erhalten also verschiedene this
-Werte, weil sich jedes this
in einer anderen Funktion befindet: das erste befindet sich innerhalb der von Node erstellten Modul-Wrapper-Funktion und das zweite befindet sich innerhalb von aFunction
.
Um das zu verstehen, müssen Sie verstehen, dass Node.js Ihren Modulcode tatsächlich in eine Funktion wie diese einpackt
%Vor%Detaillierte Erklärungen finden Sie in dieser Antwort .
Nun, diese umbrochene Funktion wird tatsächlich so aufgerufen
> %Vor% So ist this
auf der Modulebene das Objekt exports
.
Sie können das so bestätigen
%Vor% Dies liegt daran, dass das globale Standardobjekt in einem Node.js-Modul das exports
-Objekt ist und Sie test()
aufrufen, das this
nicht angibt. In herkömmlichen JS verweist this
auf das globale Objekt, wobei use strict
, this
null ist.
this
kann auf alles zeigen, es hängt nur davon ab, wie Sie es nennen.
test()
: Verwendet das globale Objekt ( exports
) als this
, außer im strikten Modus, in dem this
null ist; test.call({})
oder test.apply({})
: Sie geben an, was als this
(der erste Parameter) var obj = {testRef: test}; obj.testRef()
: this
wird links von .
gesetzt, also obj
Gegen die Antwort von fourtheye
Es stimmt, dass this
in der obersten Ebene des Moduls exports
ist, aber das bedeutet nicht unbedingt, dass this
in test()
auch auf die gleiche Stelle verweist, von wo aus sie aufgerufen wurde.
Versuch zu beweisen, dass this
und das globale Objekt beide auf exports
Tags und Links javascript node.js