Поскольку у сценария кофе нет 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
в глобальном пространстве имен (что бы это ни было).
Вот и все :)