Étant donné que le script coffee n'a pas de var
déclaration, il l'insère automatiquement pour toutes les variables dans le script coffee, de cette façon, il empêche la version JavaScript compilée de tout divulguer dans l' espace de noms global .
Donc, puisqu'il n'y a aucun moyen de faire quelque chose "fuir" dans l' espace de noms global du côté café-script des choses, vous devez définir vos variables globales en tant que propriétés de l' objet global .
les attacher en tant que propriétés sur la fenêtre
Cela signifie que vous devez faire quelque chose comme window.foo = 'baz';
, qui gère le cas du navigateur, car l' objet global est le window
.
Node.js
Dans Node.js, il n'y a pas d' window
objet, mais plutôt l' exports
objet qui est passé dans le wrapper qui enveloppe le module Node.js (Voir: https://github.com/ry/node/blob/master/src/node.js# L321 ), donc dans Node.js ce que vous devez faire est exports.foo = 'baz';
.
Voyons maintenant ce qu'il indique dans votre citation de la documentation:
... ciblant à la fois CommonJS et le navigateur: root = exports? ce
Ceci est évidemment un script de café, alors regardons ce que cela compile réellement:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
Tout d'abord, il vérifiera si exports
est défini, car essayer de référencer une variable inexistante en JavaScript produirait sinon une SyntaxError (sauf lorsqu'elle est utilisée avectypeof
)
Donc, s'il exports
existe, ce qui est le cas dans Node.js (ou dans un site Web mal écrit ...), la racine pointera exports
, sinon this
. Alors quoi this
?
(function() {...}).call(this);
L'utilisation .call
d'une fonction liera l' this
intérieur de la fonction au premier paramètre passé, dans le cas où le navigateur this
serait maintenant l' window
objet, dans le cas de Node.js, ce serait le contexte global qui est également disponible en tant global
qu'objet.
Mais puisque vous avez la require
fonction dans Node.js, il n'est pas nécessaire d'affecter quelque chose à l' global
objet dans Node.js, à la place vous attribuez à l' exports
objet qui est ensuite renvoyé par la require
fonction.
Café-Script
Après toutes ces explications, voici ce que vous devez faire:
root = exports ? this
root.foo = -> 'Hello World'
Cela déclarera notre fonction foo
dans l'espace de noms global (quel qu'il soit).
C'est tout :)