Comment puis-je définir des variables globales en CoffeeScript?
Sur Coffeescript.org:
bawbag = (x, y) ->
z = (x * y)
bawbag(5, 10)
serait compiler:
var bawbag;
bawbag = function(x, y) {
var z;
return (z = (x * y));
};
bawbag(5, 10);
la compilation via coffee-script sous node.js enveloppe la sorte:
(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 globales pour d'autres scripts à utiliser,
joindre en tant que propriétés de la fenêtre, ou sur les exportations de l'objet dans
CommonJS. Les existentielle de l'opérateur (ci-dessous), vous donne un
moyen fiable de déterminer où les ajouter, si vous ciblez les deux
CommonJS et le navigateur: root = exportations ? cette
Comment puis-je définir des Variables Globales puis en CoffeeScript. Qu'est-ce que les joindre en tant que propriétés dans la fenêtre " signifie pour vous?
- Notez que l'utilisation de variables globales est mauvais, c2.com/cgi/wiki?GlobalVariablesAreBad, et même considéré comme nocif, c2.com/cgi/wiki?GotoConsideredHarmful. Et il n'y a vraiment aucune raison de les utiliser en JavaScript à tous, comme vous l'avez d'excellentes fonctionnalités, comme les fermetures qui peut résoudre la plupart des problèmes que vous utilisez des variables globales à résoudre.
- Alors que je suis d'accord avec vous, ici, dans certains cas, il est nécessaire de créer une centrale d'application de l'objet et ont des modules être attaché à elle.
- centrale objets peuvent être enregistrés en vigueur de l'état global des objets, comme le
window
objet ou de laexports
objet. pas besoin de créer des variables globales. - les variables globales sont enregistrés en tant que propriétés de l'
window
(ouglobal
sur nodejs) objet - Ouais, c'est pas l'insta-mauvais d'avoir un mondial var. Juste une mauvaise pratique de tuyau de votre application vers le bas avec eux à la légère. Déclarant l'un et en l'utilisant comme un adaptateur d'usine comme jQuery ou d'un espace de noms est vraiment pratique courante.
Vous devez vous connecter pour publier un commentaire.
Puisque le café script a pas de
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 le espace de noms global.Donc, puisqu'il n'y a pas moyen de faire quelque chose de "fuite" dans le 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.
Cela signifie que vous devez faire quelque chose comme
window.foo = 'baz';
, qui gère le navigateur de l'affaire, car il y a la objet global est lewindow
.Node.js
Dans Node.js il n'y a pas
window
objet, au lieu de cela, il y a laexports
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 deexports.foo = 'baz';
.Maintenant, laissez-nous jeter un oeil à ce qu'il dit dans votre citation de la documentation:
C'est évidemment le café-script, donc, nous allons jeter un regard sur ce que tout cela compile:
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 destypeof
)Donc si
exports
existe, ce qui est le cas dans Node.js (ou dans un mal écrite, Site web...) racine de point deexports
, sinon àthis
. Alors, quel estthis
?À l'aide de
.call
sur une fonction qui permet de lier lethis
à l'intérieur de la fonction pour le premier paramètre transmis, dans le cas du navigateurthis
serait désormais lewindow
objet, en cas de Node.js il serait le contexte mondial qui est également disponible en tant queglobal
objet.Mais puisque vous avez l'
require
fonction dans Node.js, il n'y a pas besoin d'assigner quelque chose à laglobal
objet dans Node.js au lieu de vous affecter à laexports
objet qui est ensuite renvoyé par larequire
fonction.Café-Script
Après toutes ces explications, voici ce que vous devez faire:
Cela va déclarer notre fonction
foo
dans l'espace de noms global (quel qu'il puisse être).C'est tout 🙂
global
,GLOBAL
, etroot
objets dans node.js?ReferenceError
?(exports ? this).foo = -> 'Hello World'
global = exports ? this
. La revendication que "dans le cas de Node.js il serait le contexte global..." est erronée parce que lethis
variable, en cas de besoin ou exécuter par node.js, est évaluée comme la portée de module. Donc, si vous attendez de réglage accessoires, il sera accessible dans le monde entier, vous serez déçu. Si vous ne souhaitez définir les choses à l'échelle mondiale en node.js contexte, vous devez utiliser leglobal
variable, plutôt que dethis
.this
de secours, vous pouvez simplement dire:exports?.foo = -> 'Hello World'
Cela empêche CoffeeScript de déclarer la variable. J'ai utilisé cette astuce dans un nœud du module:module?.exports = …
Pour moi, il semble que @atomicules a la réponse la plus simple, mais je pense qu'il peut être simplifié un peu plus. Vous avez besoin de mettre un
@
avant tout ce que vous voulez être global, de sorte qu'il compile pourthis.anything
etthis
se réfère à l'objet global.donc...
compile...
et fonctionne à l'intérieur et à l'extérieur de l'enveloppe donnée par node.js
this
ne fait plus référence à l'objet globalwindow.myVariable
qui fonctionne partout.=>
au lieu de->
qui indique coffeescript pour créer la fonction en vertu de la ce/espace de noms global@
avant tout ce que vous voulez être global" :/this
(@
) se réfère à l'objet global ou quelque chose d'autre.Ivo cloué, mais je vais mentionner qu'il est un sale truc que vous pouvez utiliser, mais je ne le recommande pas si vous allez pour les points de style: Vous pouvez intégrer du code JavaScript directement dans votre CoffeeScript en s'échappant avec backticks.
Cependant, voici pourquoi c'est généralement une mauvaise idée: La CoffeeScript compilateur est pas au courant de ces variables, ce qui signifie qu'ils ne vont pas obéir à la normale CoffeeScript règles de portée. Donc,
compile de
et maintenant vous avez vous-même deux
foo
s dans des champs d'application différents. Il n'y a pas moyen de modifier les mondialefoo
de CoffeeScript code sans faire référence à l'objet global, que le Lierre décrit.Bien sûr, c'est seulement un problème si vous faites une cession à
foo
en CoffeeScript—sifoo
est devenu en lecture seule après avoir donné sa valeur initiale (c'est à dire que c'est une constante globale), puis le JavaScript intégré approche de la solution pourrait être un peu sorta acceptable (mais toujours pas recommandé).foo
variable, en raison devar
de levage (JS analyses à l'avance pour tous lesvar
déclarations et les interprète comme s'ils étaient au top de la fonction)expect = require('chai').expect;
faitexpect
variable disponible dans tous mes fichiers de test!Vous pouvez passer l'option-b lorsque vous compilez le code via coffee-script sous node.js.
Le code compilé sera le même que sur coffeescript.org.
coffee
de commande.À ajouter à Ivo Wetzel réponse
Il semble être une abréviation de syntaxe pour
exports ? this
que je ne peux que trouver documenté/mentionné sur une Google publication.I. e. dans une page web pour faire une fonction disponible dans le monde entier que vous déclarez la fonction de nouveau avec un
@
préfixe:Je pense que ce que vous essayez d'atteindre peut-être simplement fait comme ceci :
Pendant que vous compilez le coffeescript, utilisez l'option "-b" paramètre.
-b
/--bare
Compiler le code JavaScript sans la fonction de premier niveau de sécurité wrapper.Donc quelque chose comme ceci :
coffee -b --compile somefile.coffee whatever.js
Ce sera la sortie de votre code, tout comme dans les CoffeeScript.org site.
Si vous êtes une mauvaise personne (je suis une mauvaise personne.), vous pouvez obtenir aussi simple que cela:
(->@)()
Comme dans
Cela fonctionne, parce que, lors de l'invocation d'un
Reference
à unFunction
‘nu’ (qui est,func()
, au lieu denew func()
ouobj.func()
), quelque chose qui est couramment appelé la "fonction-appel d'invocation de modèle", toujours liethis
à l'objet global pour que contexte d'exécution.La CoffeeScript ci-dessus compile de
(function(){ return this })()
; nous sommes donc exercice de ce comportement fiable pour accéder à l'objet global.Depuis coffeescript est rarement utilisé sur son propre, vous pouvez utiliser
global
variable fournie par des node.js ou browserify (et tous les descendants, comme coffeeify, gulp scripts de construction, etc).Dans node.js
global
est l'espace de noms global.Dans browserify
global
est égal àwindow
.Donc, il suffit de: