Question

Sur Coffeescript.org:

bawbag = (x, y) ->
    z = (x * y)

bawbag(5, 10) 

compilerait à:

var bawbag;
bawbag = function(x, y) {
  var z;
  return (z = (x * y));
};
bawbag(5, 10);

compilation via script de café sous Node.js enveloppements que si:

(function() {
  var bawbag;
  bawbag = function(x, y) {
    var z;
    return (z = (x * y));
  };
  bawbag(5, 10);
}).call(this);

Docs disent:

  

Si vous souhaitez créer des variables de haut niveau pour les autres scripts à utiliser,   les attacher comme des propriétés sur la fenêtre, ou sur les exportations objet en   CommonJS. L'opérateur existentiel (couvert ci-dessous), vous donne un   moyen fiable pour savoir où les ajouter, si vous ciblez   CommonJS et le navigateur: root = exportations? ce

Comment définir des variables globales puis en CoffeeScript. Qu'est-ce que « les attacher comme des propriétés sur la fenêtre » signifie?

Était-ce utile?

La solution

Depuis coffeescript n'a pas de déclaration de var qu'il insère automatiquement pour toutes les variables dans le script café, de cette façon, il empêche la version compilée JavaScript de fuir tout dans le espace de nommage global .

car il n'y a aucun moyen de faire quelque chose « fuite » dans l'espace de noms global du côté coffeescript des choses sur le but, vous devez définir vos variables globales en tant que propriétés du objet global .

  

les attacher comme des 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 il l'objet global est le window.

Node.js

Dans Node.js il n'y a aucun objet window, au lieu il y a l'objet exports qui est passé dans l'enveloppe qui enveloppe le module Node.js (voir: https://github.com/ry/node/blob/master/src/node.js#L321 ), donc en noeud .js ce que vous devez faire est exports.foo = 'baz';.

Maintenant, nous allons jeter un oeil à ce qu'il dit dans votre citation de la documentation:

  

... ciblant les CommonJS et le navigateur: root = exportations? ce

Ceci est évidemment coffeescript, donc nous allons jeter un coup d'oeil dans ce que cela compile en fait à:

var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;

D'abord, il vérifiera si exports est défini, car essayer de faire référence à une variable non existant en JavaScript autrement donner une SyntaxError (sauf quand il est utilisé avec typeof)

Donc, si exports existe, ce qui est le cas dans Node.js (ou dans un WebSite mal écrit ...) racine pointera vers exports, sinon à this. Alors, quel est this?

(function() {...}).call(this);

Utilisation .call sur une fonction va lier la this dans la fonction au premier paramètre passé, en cas de this du navigateur maintenant serait l'objet window, en cas de Node.js serait le contexte mondial qui est également disponible en tant que l'objet global.

Mais puisque vous avez la fonction require dans Node.js, il n'y a pas besoin d'attribuer quelque chose à l'objet global dans Node.js, au lieu que vous attribuez à l'objet exports qui est ensuite retourné par la fonction require.

Café-Script

Après tout cette explication, voici ce que vous devez faire:

root = exports ? this
root.foo = -> 'Hello World'

déclarera notre foo de fonction dans l'espace de noms global (tout ce qui arrive à être).
C'est tout:)

Autres conseils

Pour moi, il semble @atomicules a la réponse la plus simple, mais je pense qu'il peut être simplifié un peu plus. Vous devez mettre @ avant tout ce que vous voulez être globale, de sorte qu'il compile à this.anything et this fait référence à l'objet global.

so ...

@bawbag = (x, y) ->
    z = (x * y)

bawbag(5, 10)

compile à ...

this.bawbag = function(x, y) {
  var z;
  return z = x * y;
};
bawbag(5, 10);

et travaille à l'intérieur et à l'extérieur de l'enveloppe donnée par Node.js

(function() {
    this.bawbag = function(x, y) {
      var z;
      return z = x * y;
    };
    console.log(bawbag(5,13)) // works here
}).call(this);

console.log(bawbag(5,11)) // works here

Ivo clouée, mais je vais mentionner qu'il ya un truc sale, vous pouvez utiliser, bien que je ne le recommande pas si vous allez pour les points de style: Vous pouvez intégrer le code JavaScript directement dans votre CoffeeScript en échapper avec des accents graves.

Cependant, voici pourquoi cela est généralement une mauvaise idée: Le compilateur CoffeeScript ne connaît pas ces variables, ce qui signifie qu'ils ne seront pas obéir à des règles de détermination de la portée CoffeeScript normale. Ainsi,

`foo = 'bar'`
foo = 'something else'

à compiler

foo = 'bar';
var foo = 'something else';

et maintenant vous avez vous-même deux foos dans différents champs d'application. Il n'y a aucun moyen de modifier le global foo à partir du code CoffeeScript sans faire référence à l'objet global, comme décrit Ivy.

Bien sûr, cela est un problème que si vous faites une affectation à foo en CoffeeScript, si foo est devenu en lecture seule après avoir reçu sa valeur initiale (il est une constante globale), l'approche de solution JavaScript intégré pourrait être un peu sorta acceptable (mais toujours pas recommandé).

Vous pouvez passer l'option -b lorsque vous compilez code via script de café sous Node.js. Le code compilé sera le même que sur coffeescript.org.

Pour ajouter de réponse Ivo Wetzel

Il semble y avoir une syntaxe abrégée pour exports ? this que je ne trouve documenté / mentionné sur Google affichage de groupe .

i.e.. dans une page Web pour créer une fonction disponible dans le monde, vous déclarez à nouveau la fonction avec un préfixe @:

<script type="text/coffeescript">
    @aglobalfunction = aglobalfunction = () ->
         alert "Hello!"
</script>

<a href="javascript:aglobalfunction()" >Click me!</a>

Je pense que ce que vous essayez d'atteindre peut simplement faire comme ceci:

Alors que vous compilez le coffeescript, utilisez le paramètre "-b".

-b / --bare Compiler le JavaScript sans l'emballage de sécurité de fonctionnement de niveau supérieur.

Alors quelque chose comme ceci: coffee -b --compile somefile.coffee whatever.js

Ceci affichera votre code comme dans le site CoffeeScript.org.

Si vous êtes une mauvaise personne (je suis une mauvaise personne.), Vous pouvez obtenir aussi simple que cela: (->@)()

Comme dans,

(->@)().im_a_terrible_programmer = yes
console.log im_a_terrible_programmer

Cela fonctionne, parce que lors de l'appel d'un Reference à un Function « nu » (qui est, func(), au lieu de new func() ou obj.func()), quelque chose communément appelé le « modèle d'appel d'appel de fonction », toujours se fixe this à l'objet global pour que contexte d'exécution .

Le CoffeeScript ci-dessus compile simplement (function(){ return this })(); donc nous faisons de l'exercice que le comportement pour accéder de manière fiable l'objet global.

Depuis coffeescript est rarement utilisé sur son propre, vous pouvez utiliser variable global fournie soit par Node.js ou browserify (et les descendants comme coffeeify, gulp créer des scripts, etc).

Dans global Node.js est espace de noms global.

Dans global browserify est égal à window.

Alors, il suffit:

somefunc = ->
  global.variable = 123
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top