Poiché lo script coffee non ha alcuna varistruzione, lo inserisce automaticamente per tutte le variabili nello script coffee, in questo modo impedisce alla versione compilata di JavaScript di perdere tutto nello spazio dei nomi globale .
Quindi, poiché non c'è modo di far "fuoriuscire" qualcosa nello spazio dei nomi globale dal lato dello script del caffè delle cose di proposito, è necessario definire le variabili globali come proprietà dell'oggetto globale .
allegarli come proprietà sulla finestra
Ciò significa che devi fare qualcosa di simile window.foo = 'baz';, che gestisce il caso del browser, poiché lì l' oggetto globale è il window.
Node.js
In Node.js non c'è nessun windowoggetto, invece c'è l' exportsoggetto che viene passato nel wrapper che avvolge il modulo Node.js (Vedi: https://github.com/ry/node/blob/master/src/node.js# L321 ), quindi in Node.js quello che dovresti fare è exports.foo = 'baz';.
Ora diamo un'occhiata a ciò che afferma nella tua citazione dai documenti:
... indirizzato sia a CommonJS che al browser: root = export? Questo
Questo è ovviamente un copione del caffè, quindi diamo un'occhiata a ciò che effettivamente compila:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
Innanzitutto verificherà se exportsè definito, poiché il tentativo di fare riferimento a una variabile inesistente in JavaScript altrimenti produrrebbe un SyntaxError (tranne quando viene utilizzato con typeof)
Quindi, se exportsesiste, come nel caso di Node.js (o in un sito Web mal scritto ...), punterà a exports, altrimenti a this. Allora che cos'è this?
(function() {...}).call(this);
L'uso di .calluna funzione vincolerà l' thisinterno della funzione al primo parametro passato, nel caso in cui il browser thisora sia l' windowoggetto, nel caso di Node.js sarebbe il contesto globale che è anche disponibile come globaloggetto.
Ma poiché hai la requirefunzione in Node.js, non è necessario assegnare qualcosa globalall'oggetto in Node.js, invece devi assegnare exportsall'oggetto che poi viene restituito dalla requirefunzione.
Coffee-Script
Dopo tutta quella spiegazione, ecco cosa devi fare:
root = exports ? this
root.foo = -> 'Hello World'
Questo dichiarerà la nostra funzione foonello spazio dei nomi globale (qualunque cosa accada).
È tutto :)