Bedeutung von "this" in node.js Modulen und Funktionen

22

Ich habe eine JavaScript-Datei, die von require geladen wird.

%Vor%

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?

    
Gökçer Gökdal 31.03.2014, 19:20
quelle

3 Antworten

33

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 .

    
apsillers 31.03.2014, 20:21
quelle
23

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%     
thefourtheye 17.06.2015 14:45
quelle
-1

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)
  • verwendet werden soll
  • 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

zeigen %Vor%     
Juan Mendes 17.06.2015 14:56
quelle

Tags und Links