будет компилироваться в:

bawbag = (x, y) ->
    z = (x * y)

bawbag(5, 10) 

компиляция с помощью coffee-script в файле node.js, обернутая так:

var bawbag;
bawbag = function(x, y) {
  var z;
  return (z = (x * y));
};
bawbag(5, 10);

Документы говорят:

(function() {
  var bawbag;
  bawbag = function(x, y) {
    var z;
    return (z = (x * y));
  };
  bawbag(5, 10);
}).call(this);

Если вы хотите создать верхний уровень переменные для использования другими сценариями, прикрепите их как свойства к окну или к объекту экспорта в CommonJS. Экзистенциальный оператор (описанный ниже) дает вам надежный способ выяснить, куда их добавить, если вы ориентируетесь и на CommonJS, и на браузер: root = exports? this

Как определить глобальные переменные затем в CoffeeScript. Что означает «прикрепить их как свойства к окну»?

Поскольку в сценарии кофе нет оператора

, он автоматически вставляет его для всех переменных в сценарии кофе, таким образом он предотвращает утечку скомпилированной версии JavaScript в глобальное пространство имен var автоматически вставляет его для всех переменных в coffee-script, таким образом, он предотвращает утечку скомпилированной версии JavaScript в . Чтобы сделать что-то «просачивающимся» в Глядя на вывод

со стороны сценариев кофе, вы должны определить свои глобальные переменные как свойства . Чтобы сделать что-то «просачивающимся» в присоединить их как свойства к окну Глобальный объект Глядя на вывод

Это означает, что вам нужно сделать что-то вроде

, который обрабатывает случай браузера, так как в Node.js window.foo = 'baz'; нет объекта Глобальный объект javascript — Как вернуть значение из асинхронной функции обратного вызова? — Переполнение стека window Глядя на вывод

для JavaScript на стороне сервера) или использует «Polyfill». Polyfill для этой функциональности, однако, тривиален, и, поскольку он делает код более легким для чтения, его стоит включить в Polyfill.

, который передается в оболочку, которая обертывает модуль Node.js (см .: window Например: {* } Поскольку введение exports https : //github.com/ry/node/blob/master/src/node.js # L321 ), поэтому в Node.js вам нужно сделать Теперь давайте взгляните на то, что написано в вашей цитате из документации: exports.foo = 'baz'; Глядя на вывод

… предназначено как для CommonJS, так и для браузера: root = exports? this

Это, очевидно, кофейный скрипт, поэтому давайте посмотрим, к чему это на самом деле компилируется:

Сначала он проверит, определен ли

var root;
root = (typeof exports !== "undefined" && exports !== null) ? exports : this;

, так как в противном случае попытка ссылки на несуществующую переменную в JavaScript привела бы к Ошибка SyntaxError (кроме случаев, когда она используется с exports, существует в случае с корнем Node.js (или плохо написанным сайтом WebSite …) и будет указывать на typeof С чем вы столкнулись

, поэтому если exports, в противном случае на exports. Так что же в функции будет связывать this внутри функции с первым переданным параметром, в случае браузера this?

(function() {...}).call(this);

массивов .call теперь будет объектом this, в случае Node.js это будет this global context window, который также доступен как объект . Но так как у вас есть объект global в Node.js, вы вместо этого присваиваете объекту

, который затем возвращается require функцию в Node.js , нет необходимости назначать что-либо для ссылки global Coffee-Script exports После всего этого объяснения, вот что вам нужно сделать: require.

Это объявит нашу функцию

в глобальном пространстве имен (каким бы оно ни было).

root = exports ? this
root.foo = -> 'Hello World'

Вот и все :) Мне кажется, @atomicules имеет самый простой ответ, но я думаю, что это может быть упрощено немного больше. Вам нужно поставить foo перед всем, что вы хотите сделать глобальным, чтобы оно компилировалось в
, ссылаясь на глобальный объект.

так … @ компилируется в …this.anything и this ссылки на глобальный объект.

так …

@bawbag = (x, y) ->
    z = (x * y)

bawbag(5, 10)

компилируется в …

this.bawbag = function(x, y) {
  var z;
  return z = x * y;
};
bawbag(5, 10);

и работает внутри и снаружи оболочки, предоставленной node.js

(function() {
    this.bawbag = function(x, y) {
      var z;
      return z = x * y;
    };
    console.log(bawbag(5,13)) // works here
}).call(this);

console.log(bawbag(5,11)) // works here

Иво прибил ее, но я упомяну, что есть один грязный трюк Можно использовать, хотя я не рекомендую его, если вы собираетесь использовать стилевые точки: вы можете встроить код JavaScript прямо в ваш CoffeeScript, избегая его с помощью обратных кавычек.

Однако вот почему это обычно плохая идея: компилятор CoffeeScript не знает об этих переменных, что означает, что они не будут подчиняться нормальным правилам области действия CoffeeScript. Итак,

`foo = 'bar'`
foo = 'something else'

компилируется в

foo = 'bar';
var foo = 'something else';

, и теперь у вас есть два foo в разных областях. Нет способа изменить Более простой способ ES6 — foo из кода CoffeeScript без ссылки на глобальный объект, как описал Айви.

Конечно, это проблема, только если вы сделаете присваивание foo в CoffeeScript — если foo стал доступным только для чтения после получения его начального значения (т. Е. Это глобальная константа), то встроенное решение JavaScript подход может быть своего рода приемлемым (хотя все еще не рекомендуется).

Вы можете передать опцию -b, когда вы компилируете код с помощью coffee-script в файле node.js. Скомпилированный код будет таким же, как на coffeescript.org.

Добавление к ответу Иво Ветцеля

Кажется, что для exports ? this существует сокращенный синтаксис, который я могу найти только документированным / упомянутым в публикации группы Google Глядя на вывод

I.e. на веб-странице, чтобы сделать функцию доступной глобально, вы снова объявляете функцию с префиксом @:

<script type="text/coffeescript">
    @aglobalfunction = aglobalfunction = () ->
         alert "Hello!"
</script>

<a href="javascript:aglobalfunction()" >Click me!</a>

Я думаю, что вы пытаетесь достичь, можно просто сделать так:

Пока вы компилируете coffeescript, используйте параметр «-b».

-b / --bare Скомпилируйте JavaScript без функции безопасности верхнего уровня.

Так что-то вроде этого: coffee -b --compile somefile.coffee whatever.js

Это выведет ваш код так же, как на сайте CoffeeScript.org.

Если вы плохой человек (я плохой человек), вы можете получить так просто: (->@)()

Как,

(->@)().im_a_terrible_programmer = yes
console.log im_a_terrible_programmer

Это работает, потому что при вызове Reference для Function «голый» (то есть func() вместо new func() или obj.func()), что-то обычно называемый «шаблоном вызова вызова функции», всегда связывает this с глобальным объектом для этого ОБНОВЛЕНИЕ — версия многократного использования Глядя на вывод

Приведенный выше код CoffeeScript просто компилируется в (function(){ return this })() ;, поэтому мы используем это поведение надежный доступ к глобальному объекту.

Поскольку coffeescript редко используется сам по себе, вы можете использовать переменную global, предоставляемую либо node.js, либо browserify (и любыми потомками, такими как coffeeify, сценарии сборки gulp и т. Д.).

В node.js global — глобальное пространство имен.

In browserify global равно window Глядя на вывод

Итак, просто:

somefunc = ->
  global.variable = 123