Dado que la secuencia de comandos de café no tiene ninguna vardeclaració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 windowobjeto, en su lugar está el exportsobjeto 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 exportsestá definido, ya que intentar hacer referencia a una variable inexistente en JavaScript produciría un SyntaxError (excepto cuando se usa con typeof)
Entonces, si exportsexiste, 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 .callde una función vinculará el thisinterior de la función con el primer parámetro pasado, en el caso de que el navegador thisahora sea el windowobjeto, en el caso de Node.js sería el contexto global que también está disponible como el globalobjeto.
Pero dado que tiene la requirefunción en Node.js, no es necesario asignar algo al globalobjeto en Node.js, sino que asigna al exportsobjeto que luego devuelve la requirefunció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 fooen el espacio de nombres global (sea lo que sea).
Eso es todo :)