Как определить глобальные переменные в CoffeeScript?


ВКЛ Coffeescript.org:

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

bawbag(5, 10) 

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

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

компиляция через coffee-script под узлом.js обертывает это так:

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

врачи скажут, что:

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

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

8 311

8 ответов:

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

так как нет никакого способа сделать что-то" утечка " в глобальное пространство имен со стороны кофе-скрипта вещей нарочно, вам нужно определить ваши глобальные переменные как свойства глобальные объект.

прикрепите их как свойства на окне

это означает, что вам нужно сделать что-то вроде window.foo = 'baz';, который обрабатывает случай браузера, так как там глобальный объект - это window.

узел.js

В Узел.js там нет

мне кажется, что @atomicules имеет самый простой ответ, но я думаю, что его можно упростить немного больше. Вам нужно поставить@ прежде всего, вы хотите быть глобальным, так что он компилируется в 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);

и работает внутри и снаружи оболочки, данного узла.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';

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

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

вы можете передать опцию-b при компиляции кода через coffee-script под узлом.js. Скомпилированный код будет таким же, как и на coffeescript.org.

добавить ответ Иво Ветцеля

кажется, есть сокращенный синтаксис для exports ? this что я могу найти только документально/указал на Google group posting.

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

<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 переменная, предоставленная любым узлом.js или browserify (и любые потомки, такие как coffeeify, Gulp build scripts и т. д.).

в узел.js global глобальное пространство имен.

в browserify global равна window.

так, просто:

somefunc = ->
  global.variable = 123