Depuis le café le script n'a pas d' var
déclaration qu'il insère automatiquement pour toutes les variables dans le coffee-script, de cette façon, il empêche la compilation version JavaScript de fuite tout en l' espace de noms global.
Donc, puisqu'il n'y a pas moyen de faire quelque chose de "fuite" dans l' espace de noms global du coffee-script côté des choses sur le but, vous devez définir vos variables globales comme des propriétés de l' objet global.
joindre en tant que propriétés de la fenêtre
Cela signifie que vous devez faire quelque chose comme window.foo = 'baz';
, qui gère le navigateur de l'affaire, car il y a l' objet global est l' window
.
Node.js
Dans Node.js il n'y a pas d' window
objet, au lieu de cela, il y a la exports
objet qui est passée dans le wrapper qui enveloppe le Node.js module (Voir: https://github.com/ry/node/blob/master/src/node.js#L321 ), donc dans Node.js ce que vous devez faire est de exports.foo = 'baz';
.
Maintenant, laissez-nous jeter un oeil à ce qu'il dit dans votre citation de la documentation:
...visant à la fois CommonJS et le navigateur: root = exportations ? cette
C'est évidemment le café-script, donc, nous allons jeter un regard sur ce que tout cela compile:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
D'abord, il va vérifier si exports
est défini, puisqu'en essayant de faire référence à un inexistante variable en JavaScript serait autrement le rendement d'une SyntaxError (sauf lorsqu'il est utilisé avec des typeof
)
Donc, si exports
, ce qui est le cas dans Node.js (ou dans un mal écrite, Site web...) racine de point de exports
, sinon à l' this
. Alors, quel est this
?
(function() {...}).call(this);
À l'aide de .call
sur une fonction de lier l' this
à l'intérieur de la fonction pour le premier paramètre transmis, dans le cas du navigateur this
sera désormais l' window
objet, en cas de Node.js il serait le contexte global qui est également disponible en tant que global
objet.
Mais puisque vous avez l' require
fonction dans Node.js, il n'y a pas besoin d'assigner quelque chose à l' global
objet Node.js au lieu de vous attribuer à l' exports
objet qui est ensuite renvoyé par l' require
fonction.
Coffee-Script
Après toutes ces explications, voici ce que vous devez faire:
root = exports ? this
root.foo = -> 'Hello World'
Cela va déclarer notre fonction foo
en l'espace de noms global (quel qu'il puisse être).
C'est tout :)