2016-03-20 5 views
2

Ich habe die folgende test.js-Datei, die zwei Zeilen der Ausgabe ausgibt, prüft jede Zeile für strikte Gleichheit zwischen dem globalen Objekt und this.Warum ist der globale Kontext des Knotens nur manchmal in einem Beispiel?

var c = require("console"); 

console.log(this === global); 

(function() { 
    console.log(this === global); 
})(); 

Wenn ich laufen diese Datei aus dem Zeilenbefehl node.exe test.js ich folgende Ausgabe:

falsch
wahr

Jedoch, wenn ich test.js aus dem Inneren der Last Knoten REPL es mir verschiedene Ausgabe bietet:

wahr
wahr

Dies ist die vollständige Transkript des Skripts in dem REPL Laden

PS C:\Programming> node 
> .load test.js 
.load test.js 
> var c = require("console"); 
undefined 
> console.log(this === global); 
true 
undefined 
> 
> (function() { 
...  console.log(this === global); 
... })(); 
true 
undefined 
> 
> .exit 

Was ist die Ursache der Differenz in der Ausgabe zwischen diesen beide Laufe Szenarien aus dem gleichen Skript?

Der strikte Modus ist in beiden Fällen nicht aktiviert (die Befehlszeile des Knotens setzt standardmäßig strict auf false); Der Code ruft keinen strikten Modus mit 'use strict'; auf.

Ich verwende Knoten 5.9.0 unter Windows 10 x64.

Antwort

2

Der Grund ist, dass die beiden Umgebungen unterschiedlich sind. Wenn Sie eine Datei in der Befehlszeile oder require() eine Datei ausführen, werden sie als Knotenmodule geladen, die in einer speziellen Umgebung mit this === module.exports ausgeführt werden (obwohl Sie exports/module.exports anstelle von this in Modulen verwenden sollten).

Es hat keinen Sinn, eine REPL wie ein Knotenmodul aufgrund der Art und des Zwecks einer REPL zu behandeln, daher wird der gesamte Code in der REPL einfach innerhalb desselben Bereichs ausgeführt.

Verwandte Themen