Jugando un poco con coffeescript y Rails 3.1.0.rc4. Tener este código:

yourMom = (location) ->
  console.log location

yourMom "wuz hur"

Cuando se carga la página, esto genera "wuz hur" correctamente. Pero cuando trato de llamar

yourMom("wuz hur")

De la consola de Chrome JS (como a veces hago para probar las funciones normales de JS), obtengo un "ReferenceError: yourMom no está definido"

¿Las funciones generadas por coffeescript están disponibles de esta manera?

16
Lee Quarella 20 jul. 2011 a las 05:32

4 respuestas

La mejor respuesta

Una forma más fácil de compartir métodos / variables globales es usar @, lo que significa esto.

@yourMom = (location) ->
  console.log location

yourMom "wuz hur"

Sintaxis mejor y más fácil de leer, pero no te animo a crear métodos / variables globales

37
Sébastien Gruhier 13 sep. 2011 a las 09:48

Esto sucede porque coffeescript envuelve todo en un cierre. La salida de JavaScript de ese código es en realidad:

(function() {
  var yourMom;
  yourMom = function(location) {
    return console.log(location);
  };
  yourMom("wuz hur");
}).call(this);

Si desea exportarlo al ámbito global, puede hacer lo siguiente:

window.yourMom = yourMom = (location) ->
  console.log location

O

this.yourMom = yourMom = (location) ->
  console.log location
13
Jamie Wong 20 jul. 2011 a las 01:37

Este enlace puede resolver tu problema Rails: llamar a CoffeeScript desde JavaScript Envuelva sus funciones en un espacio de nombres único y luego puede acceder a estas funciones desde cualquier lugar

0
Community 23 may. 2017 a las 12:01

No estoy seguro acerca de Rails, pero el compilador CoffeeScript tiene una opción (--bare) para compilar sin la función wrapper. Está bien para jugar, pero contamina el alcance global.

2
liammclennan 20 jul. 2011 a las 05:20