Domanda

In Coffeescript.org:

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

bawbag(5, 10) 

sarebbe compilare in:

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

compilazione tramite il caffè-script sotto Node.JS involucri che così:

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

Documenti dicono:

  

Se vuoi creare variabili a livello di top per altri script da utilizzare,   attaccarle come proprietà sulla finestra, o sulle esportazioni in oggetto   CommonJS. L'operatore esistenziale (coperto sotto), vi dà un   modo affidabile per capire dove aggiungerli, se ci si rivolge sia   CommonJS e il browser: root = esportazioni? questo

Come faccio a definire le variabili globali in poi CoffeeScript. Cosa significa 'attaccarle come proprietà sulla finestra' dire?

È stato utile?

Soluzione

Dal momento che lo script del caffè non ha comunicato var inserisce automaticamente per tutte le variabili nel caffè-script, in questo modo si impedisce la versione JavaScript compilata dalla fuoriuscita di tutto nella namespace globale .

Quindi, dal momento non c'è modo di fare qualcosa di "fuga" nella namespace globale dal lato del caffè-script di cose su scopo, è necessario definire le variabili globali come proprietà del oggetto globale .

  

fissarli come proprietà sulla finestra

Questo significa che è necessario fare qualcosa di simile window.foo = 'baz';, che gestisce il caso del browser, poiché non vi oggetto globale è il window.

Node.js

In Node.js non c'è oggetto window, invece c'è l'oggetto exports che viene passato nella involucro che avvolge il modulo Node.js (See: https://github.com/ry/node/blob/master/src/node.js#L321 ), quindi in Nodo .js che cosa si avrebbe bisogno di fare è exports.foo = 'baz';.

Ora diamo un'occhiata a ciò che si afferma nella sua citazione dalla documentazione:

  

... rivolti sia CommonJS e il browser: radice = esportazioni? questo

Questa è, ovviamente, il caffè-script, quindi cerchiamo di dare un'occhiata in quello che questo in realtà compila a:

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

Innanzitutto esso verificherà se exports è definita, poiché il tentativo di fare riferimento a una variabile inesistente in JavaScript altrimenti produrre uno SyntaxError (tranne quando viene utilizzato con typeof)

Quindi, se esiste exports, che è il caso in Node.js (o in un sito web scritto male ...) radice punterà a exports, altrimenti this. Allora, cosa c'è this?

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

Utilizzando .call su una funzione si legherà il this all'interno della funzione per il primo parametro passato, nel caso della this del browser ora sarebbe l'oggetto window, in caso di Node.js sarebbe il contesto globale che è disponibile come oggetto global anche.

Ma dal momento che si ha la funzione di require in Node.js, non c'è bisogno di qualcosa di assegnare all'oggetto global in Node.js, invece si assegna all'oggetto exports che poi viene restituita dalla funzione require.

Caffè-Script

Dopo tutto questa spiegazione, ecco cosa devi fare:

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

Questa dichiarerà la nostra funzione foo nel namespace globale (qualunque cosa che sembra essere).
Questo è tutto:)

Altri suggerimenti

A me sembra @atomicules ha la risposta più semplice, ma penso che può essere semplificato un po 'di più. Hai bisogno di mettere un @ prima di tutto si vuole essere globale, in modo che si compila in this.anything e this fa riferimento all'oggetto globale.

così ...

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

bawbag(5, 10)

compilazioni di ...

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

e lavora dentro e fuori l'involucro data dal 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 inchiodato, ma io ricordare che c'è uno sporco trucco è possibile utilizzare, anche se io non lo consiglio se si sta andando per i punti stile: È possibile incorporare codice JavaScript direttamente nel tuo CoffeeScript da scampo con apici inversi.

Tuttavia, ecco perché questo di solito è una cattiva idea: Il CoffeeScript compilatore non è a conoscenza di queste variabili, il che significa che non obbediranno normale CoffeeScript scoping regole. Così,

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

compilazioni a

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

e ora hai da soli due foos in diversi ambiti. Non c'è modo di modificare il globale foo dal codice CoffeeScript senza fare riferimento l'oggetto globale, come descritto Ivy.

Naturalmente, questo è solo un problema se si effettua un incarico di foo in CoffeeScript-se foo è diventato di sola lettura dopo essere stato dato il suo valore iniziale (vale a dire che è una costante globale), quindi l'approccio soluzione JavaScript incorporato potrebbe essere un pò sorta accettabile (anche se ancora non raccomandato).

È possibile passare l'opzione -b quando si compila il codice tramite il caffè-script sotto node.js. Il codice compilato sarà la stessa del coffeescript.org.

Per aggiungere di Ivo Wetzel

Sembra che ci sia una sintassi scorciatoia per exports ? this che posso trovare documentato / menzionato su un Google gruppo distacco .

vale a dire. in una pagina web per rendere una funzione disponibile a livello globale si dichiara la funzione di nuovo con un prefisso @:

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

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

Credo che ciò che si sta cercando di raggiungere può semplicemente essere fatto in questo modo:

Mentre si sta compilando il CoffeeScript, utilizzare il parametro "-b".

-b / --bare Compila il JavaScript senza l'involucro di livello superiore di sicurezza funzione.

Quindi, qualcosa di simile: coffee -b --compile somefile.coffee whatever.js

Questa volontà di uscita il codice, proprio come nel sito CoffeeScript.org.

Se sei una persona cattiva (io sono una persona cattiva.), È possibile ottenere semplice come questo: (->@)()

Come in,

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

Questo funziona, perché quando si richiama un Reference ad un Function 'vuota' (vale a dire, func(), invece di new func() o obj.func()), qualcosa comunemente indicato come il 'invocazione modello function-call', sempre lega this all'oggetto globale che contesto di esecuzione .

Il CoffeeScript compila sopra semplicemente per (function(){ return this })(); quindi stiamo esercitando che il comportamento di accedere in modo affidabile l'oggetto globale.

Dal CoffeeScript è usato raramente sul suo proprio, è possibile utilizzare variabile global fornito da entrambi node.js o browserify (e discendenti come coffeeify, gli script di build sorso, ecc).

In node.js global è namespace globale.

In global browserify è pari a window.

Quindi, basta:

somefunc = ->
  global.variable = 123
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top