Da das Kaffeeskript keine varAnweisung 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 windowObjekt, sondern das exportsObjekt, 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 exportsdefiniert 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 exportsvorhanden 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 .calleine Funktion verwenden, wird das thisInnere der Funktion an den ersten übergebenen Parameter gebunden. Wenn der Browser thisnun das windowObjekt ist, ist Node.js der globale Kontext, der auch als globalObjekt verfügbar ist .
Da Sie die requireFunktion in Node.js haben, müssen Sie dem globalObjekt in Node.js nichts zuweisen , sondern dem exportsObjekt zuweisen, das dann von der requireFunktion 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 fooim globalen Namespace deklariert (was auch immer das sein mag).
Das ist alles :)