Поскольку у сценария кофе нет varоператоров, он автоматически вставляет его для всех переменных в сценарии кофе, таким образом он предотвращает утечку скомпилированной версии JavaScript в глобальное пространство имен .
Таким образом, поскольку нет никакого способа сделать что-то «просачивающимся» в глобальное пространство имен со стороны кофейных сценариев, вы должны определить свои глобальные переменные как свойства глобального объекта .
прикрепить их как свойства на окне
Это означает, что вам нужно сделать что-то вроде window.foo = 'baz';, что обрабатывает случай браузера, так как там глобальный объект является window.
Node.js
В Node.js нет windowобъекта, вместо этого есть exportsобъект, который передается в оболочку, которая обертывает модуль Node.js (см .: https://github.com/ry/node/blob/master/src/node.js# L321 ), поэтому в Node.js вам нужно сделать следующее exports.foo = 'baz';.
Теперь давайте посмотрим, что говорится в вашей цитате из документации:
... ориентируясь как на CommonJS, так и на браузер: root = export? этот
Это, очевидно, сценарий кофе, так что давайте посмотрим, к чему это на самом деле компилируется:
var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;
Сначала он проверит, exportsопределено ли это, поскольку попытка ссылки на несуществующую переменную в JavaScript в противном случае приведет к ошибке SyntaxError (кроме случаев, когда она используется с typeof)
Таким образом, если exportsсуществует, что имеет место в корне Node.js (или в плохо написанном веб-сайте ...), на него будет указывать корень, в exportsпротивном случае - на this. Ну и что this?
(function() {...}).call(this);
Использование .callфункции on будет связывать thisвнутреннюю функцию с первым передаваемым параметром, в случае, если браузер thisтеперь будет windowобъектом, в случае Node.js это будет глобальный контекст, который также доступен как globalобъект.
Но поскольку у вас есть requireфункция в Node.js, нет необходимости назначать что-либо globalобъекту в Node.js, вместо этого вы присваиваете exportsобъект, который затем возвращается requireфункцией.
Кофе-Script
После всего этого объяснения вот что вам нужно сделать:
root = exports ? this
root.foo = -> 'Hello World'
Это объявит нашу функцию fooв глобальном пространстве имен (что бы это ни было).
Вот и все :)