2016-07-14 8 views
0

Ich muss das Konzept der Bereiche in Node.js verstehen. Die Tatsache, dass this === global, wenn ich den Code unterScopes im Kontext von Modulen in Node.js

//basic1.js file 
this.bar = "Bacon"; 


//basic2.js file 
require('./basic1'); 
console.log(this.bar); 

und laufen basic2.js versuchen, wird die Ausgabe statt Speck undefiniert. Da ich eine Eigenschaftsleiste im globalen Objekt und ein globales Objekt für alle Knotenmodule gemeinsam nutze, warum bekomme ich dann undefiniert als Ausgabe? Kannst du mir helfen, das zu verstehen?

+0

Wie schließen Sie, dass 'diese === global'? – robertklep

+0

this === global // true –

+0

Testen Sie das in der REPL? Dies gilt nicht für Dateien. – robertklep

Antwort

0

Um zu verstehen, wie node.js Module besser interpretieren betrachten source code: aus der Datei

  1. lesen Quellcode.
  2. Wrap-Quelle in Funktionsaufruf wie function(exports, require, module, __dirname, __filename){ /* source code */ }
  3. Geteilten Code in virtuelle Maschine v8 evaluieren (ähnlich der Eval-Funktion im Browser) und Funktion erhalten.
  4. Funktion vom vorherigen Schritt mit Überschreiben aufrufen this Kontext mit exports.

Simplified Code:

var code = fs.readFileSync('./module.js', 'utf-8'); 
var wrappedCode = `function (exports, require, module, __dirname, __filename) {\n${code}\n}`; 
var exports = {}; 
var fn = vm.runInThisContext(wrappedCode); 
var otherArgs = []; 
// ... put require, module, __dirname, __filename in otherArgs 
fn.call(exports, exports, ...otherArgs);