Pregunta

En Coffeescript.org:

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

bawbag(5, 10) 

compilará a:

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

compilar a través coffeescript bajo Node.js envolturas de modo que:

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

Documentos dicen:

  

Si desea crear variables de alto nivel para otras secuencias de comandos para usar,   adjuntarlos como propiedades en la ventana, o en las exportaciones objeto de   CommonJS. El operador existencial (cubierto más adelante), se da una   manera confiable para averiguar dónde agregar ellos, si la orientación tanto   CommonJS y el navegador: root = exportaciones? este

¿Cómo definir variables globales a continuación, en CoffeeScript. ¿Qué significa 'adjuntarlos como propiedades en la ventana' media?

¿Fue útil?

Solución

Desde coffeescript tiene ninguna declaración var se inserta automáticamente para todas las variables en el café-escritura, de esa manera se evita que la versión de JavaScript compilado se escape todo en el espacio de nombres global .

ya que no es tan hay manera de hacer algo "fugas" en la espacio de nombres global desde el lado coffeescript de las cosas a propósito, es necesario definir las variables globales como propiedades del objeto global .

  

adjuntarlos como propiedades en la ventana

Esto significa que tiene que hacer algo como window.foo = 'baz';, que maneja el caso del navegador, ya que el objeto global es la window.

Node.js

En Node.js no hay objeto window, en lugar está el objeto exports que se pasa en el envoltorio que envuelve el módulo Node.js (Véase: https://github.com/ry/node/blob/master/src/node.js#L321 ), por lo que en el nodo Js lo que se necesita hacer es exports.foo = 'baz';.

Ahora vamos a echar un vistazo a lo que se afirma en su cita de los documentos:

  

... dirigida tanto CommonJS y el navegador: root = exportaciones? este

Esto es obviamente coffeescript, así que vamos a echar un vistazo a lo que esta realidad se compila a:

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

En primer lugar se comprobará si se ha definido exports, ya que intenta hacer referencia a una variable inexistente en JavaScript que de otro modo producir un SyntaxError (excepto cuando se usa con typeof)

Así que si existe exports, que es el caso en Node.js (o en un sitio web mal escrito ...) raíz apuntará a exports, de lo contrario a this. Entonces, ¿qué this?

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

El uso de .call en una función se unirá al this dentro de la función para el primer parámetro pasado, en el caso de la this navegador ahora sería el objeto window, en caso de Node.js sería el contexto global que también está disponible como objeto global.

Pero ya que usted tiene la función require en Node.js, no hay necesidad de asignar algo al objeto global en Node.js, en lugar de asignar al objeto exports que luego se devuelve la función require.

Café-Script

Después de todo esa explicación, esto es lo que hay que hacer:

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

Esto declarar nuestra foo función en el espacio de nombres global (lo que pasa a ser).
Eso es todo:)

Otros consejos

Me parece @atomicules tiene la respuesta más simple, pero creo que se puede simplificar un poco más. Es necesario poner un @ antes de cualquier cosa que desee ser global, de manera que se compila a this.anything y this se refiere al objeto global.

así que ...

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

bawbag(5, 10)

compila a ...

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

y trabajos dentro y fuera de la envoltura dada por 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 en el clavo, pero voy a mencionar que hay un truco sucio que puede utilizar, aunque yo no lo recomiendo si vas de puntos de estilo: Puede insertar código JavaScript directamente en su CoffeeScript escapándolo con acentos abiertos.

Sin embargo, aquí es por qué esto es generalmente una mala idea: La CoffeeScript compilador no es consciente de esas variables, lo que significa que no obedece a la normalidad reglas CoffeeScript alcance. Por lo tanto,

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

compila a

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

y ahora usted se tiene dos foos en diferentes ámbitos. No hay manera de modificar el Global foo de código CoffeeScript sin hacer referencia al objeto global, como la hiedra descrito.

Por supuesto, esto es sólo un problema si se realiza una asignación a foo en CoffeeScript -si foo convirtió sólo lectura después de haber dado su valor inicial (es decir, que es una constante global), entonces el enfoque de solución de JavaScript incrustado podría ser un poco sorta aceptable (aunque todavía no se recomienda).

Puede pasar opción -b al compilar código a través de coffeescript bajo node.js. El código compilado será el mismo que en coffeescript.org.

Para añadir a de Ivo Wetzel

Parece que hay una sintaxis abreviada de exports ? this que sólo se puede encontrar documentado / mencionó en un Google grupo contable .

es decir. en una página Web para realizar una función disponible a nivel mundial declara la función de nuevo con un prefijo @:

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

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

Creo que lo que está tratando de lograr, simplemente se puede hacer así:

Mientras se está compilando el CoffeeScript, utilice el parámetro "-b".

-b / --bare Compilar el código JavaScript sin la envoltura de seguridad de función de nivel superior.

Así que algo como esto: coffee -b --compile somefile.coffee whatever.js

Esta salida su código al igual que en el sitio CoffeeScript.org voluntad.

Si usted es una mala persona (yo soy una mala persona.), Se puede obtener tan simple como esto: (->@)()

Como en,

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

esto funciona, porque cuando la invocación de una Reference a un Function 'vacía' (es decir, func(), en lugar de new func() o obj.func()), algo que comúnmente se conoce como la 'función de guardia patrón de invocación', siempre se une this al objeto global para ese href="http://www.ecma-international.org/ecma-262/6.0/#sec-execution-contexts" contexto de ejecución .

El CoffeeScript anteriormente simplemente compila a (function(){ return this })(); por lo que estamos ejercer ese comportamiento para acceder de forma fiable el objeto global.

Desde CoffeeScript se utiliza muy poco en su propia, puede utilizar la variable global suministrada por cualquiera de Node.js o browserify (y cualquier descendiente como coffeeify, guiones trago de construcción, etc.).

En Node.js es global espacio de nombres global.

En global browserify es igual a window.

Así que, simplemente:

somefunc = ->
  global.variable = 123
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top