Dado que la secuencia de comandos de café no tiene ninguna var
declaración, la inserta automáticamente para todas las variables en la secuencia de comandos de café, de esa manera evita que la versión compilada de JavaScript filtre todo en el espacio de nombres global .
Entonces, dado que no hay forma de hacer que algo "se filtre" en el espacio de nombres global desde el lado del script de café de las cosas a propósito, debe definir sus variables globales como propiedades del objeto global .
adjuntarlos como propiedades en la ventana
Esto significa que debe hacer algo como window.foo = 'baz';
manejar el caso del navegador, ya que allí el objeto global es el window
.
Node.js
En Node.js no hay ningún window
objeto, en su lugar está el exports
objeto que se pasa al contenedor que envuelve el módulo Node.js (Ver: https://github.com/ry/node/blob/master/src/node.js# L321 ), entonces en Node.js lo que necesitarías hacer es exports.foo = 'baz';
.
Ahora echemos un vistazo a lo que dice en su cita de los documentos:
... dirigido tanto a CommonJS como al navegador: raíz = exportaciones? esta
Esto es obviamente un script de café, así que echemos un vistazo a lo que esto realmente compila:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
Primero verificará si exports
está definido, ya que intentar hacer referencia a una variable inexistente en JavaScript produciría un SyntaxError (excepto cuando se usa con typeof
)
Entonces, si exports
existe, que es el caso en Node.js (o en un sitio web mal escrito ...), la raíz apuntará exports
, de lo contrario, a this
. Entonces que es this
?
(function() {...}).call(this);
El uso .call
de una función vinculará el this
interior de la función con el primer parámetro pasado, en el caso de que el navegador this
ahora sea el window
objeto, en el caso de Node.js sería el contexto global que también está disponible como el global
objeto.
Pero dado que tiene la require
función en Node.js, no es necesario asignar algo al global
objeto en Node.js, sino que asigna al exports
objeto que luego devuelve la require
función.
Coffee-Script
Después de toda esa explicación, esto es lo que debe hacer:
root = exports ? this
root.foo = -> 'Hello World'
Esto declarará nuestra función foo
en el espacio de nombres global (sea lo que sea).
Eso es todo :)