Poiché lo script coffee non ha alcuna var
istruzione, 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 window
oggetto, invece c'è l' exports
oggetto 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 exports
esiste, 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 .call
una funzione vincolerà l' this
interno della funzione al primo parametro passato, nel caso in cui il browser this
ora sia l' window
oggetto, nel caso di Node.js sarebbe il contesto globale che è anche disponibile come global
oggetto.
Ma poiché hai la require
funzione in Node.js, non è necessario assegnare qualcosa global
all'oggetto in Node.js, invece devi assegnare exports
all'oggetto che poi viene restituito dalla require
funzione.
Coffee-Script
Dopo tutta quella spiegazione, ecco cosa devi fare:
root = exports ? this
root.foo = -> 'Hello World'
Questo dichiarerà la nostra funzione foo
nello spazio dei nomi globale (qualunque cosa accada).
È tutto :)