Поскольку в сценарии кофе нет оператора var
, он автоматически вставляет его для всех переменных в сценарии кофе, что предотвращает утечку скомпилированной версии JavaScript в глобальное пространство имен .
Таким образом, поскольку невозможно что-то «просочиться» в глобальное пространство имен со стороны сценариев «кофе» специально, вам необходимо определить глобальные переменные как свойства global объект .
прикрепить их как свойства к окну
Это означает, что вам нужно сделать что-то вроде 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
в функции привяжет this
внутри функции к первому переданному параметру, в случае браузера this
теперь будет объектом window
, в случае Node.js это будет быть глобальным контекстом , который также доступен как объект global
.
Но так как у вас есть функция require
в Node.js, нет необходимости назначать что-либо объекту global
в Node.js, вместо этого вы присваиваете объекту exports
, который затем возвращается require
функция.
Кофе-Script
После всего этого объяснения вот что вам нужно сделать:
root = exports ? this
root.foo = -> 'Hello World'
Это объявит нашу функцию foo
в глобальном пространстве имен (что бы это ни было).
Вот и все:)