Da das Kaffeeskript keine var
Anweisung enthält, fügt es diese automatisch für alle Variablen im Kaffeeskript ein. Auf diese Weise wird verhindert, dass die kompilierte JavaScript-Version alles in den globalen Namespace verliert .
Da es also keine Möglichkeit gibt, absichtlich etwas von der Kaffeeskript-Seite in den globalen Namespace zu "lecken" , müssen Sie Ihre globalen Variablen als Eigenschaften des globalen Objekts definieren .
Fügen Sie sie als Eigenschaften im Fenster hinzu
Dies bedeutet, dass Sie etwas tun müssen window.foo = 'baz';
, das den Browser-Fall behandelt, da dort das globale Objekt das ist window
.
Node.js
In Node.js gibt es kein window
Objekt, sondern das exports
Objekt, das an den Wrapper übergeben wird, der das Node.js-Modul umschließt (siehe: https://github.com/ry/node/blob/master/src/node.js#) L321 ), also müssten Sie in Node.js Folgendes tun exports.foo = 'baz';
.
Lassen Sie uns nun einen Blick darauf werfen, was in Ihrem Zitat aus den Dokumenten steht:
... sowohl auf CommonJS als auch auf den Browser abzielen: root = exportiert? diese
Dies ist offensichtlich ein Kaffeeskript, also schauen wir uns an, was dies tatsächlich kompiliert:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
Zuerst wird geprüft, ob dies exports
definiert ist, da der Versuch, auf eine nicht vorhandene Variable in JavaScript zu verweisen, andernfalls einen SyntaxError ergeben würde (außer wenn er mit verwendet wird typeof
).
Wenn also exports
vorhanden ist, was in Node.js (oder in einer schlecht geschriebenen WebSite ...) der Fall ist, verweist root auf exports
, andernfalls auf this
. Also was ist this
?
(function() {...}).call(this);
Wenn Sie .call
eine Funktion verwenden, wird das this
Innere der Funktion an den ersten übergebenen Parameter gebunden. Wenn der Browser this
nun das window
Objekt ist, ist Node.js der globale Kontext, der auch als global
Objekt verfügbar ist .
Da Sie die require
Funktion in Node.js haben, müssen Sie dem global
Objekt in Node.js nichts zuweisen , sondern dem exports
Objekt zuweisen, das dann von der require
Funktion zurückgegeben wird.
Kaffee-Skript
Nach all dieser Erklärung müssen Sie Folgendes tun:
root = exports ? this
root.foo = -> 'Hello World'
Dadurch wird unsere Funktion foo
im globalen Namespace deklariert (was auch immer das sein mag).
Das ist alles :)