Как определить глобальные переменные в 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 ответов:
так как кофе скрипт не имеет
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';
и теперь у тебя есть два
foo
s в разных областях. Нет никакого способа, чтобы изменить глобальные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