Ответ 1
Ответ Harmen неплохой, но позвольте мне подробно рассказать, где это делается компилятором CoffeeScript и почему.
Когда вы скомпилируете что-то с coffee -c foo.coffee
, вы всегда получите foo.js
, который выглядит следующим образом:
(function() {
...
}).call(this);
Почему? Ну, предположим, вы поставили задание вроде
x = 'stringy string'
в foo.coffee
. Когда он видит это, компилятор спрашивает: существует ли x
в этой области или внешняя область? Если нет, он помещает объявление var x
в начало этой области в выводе JavaScript.
Теперь предположим, что вы пишете
x = 42
в bar.coffee
, скомпилируйте оба и соедините foo.js
с bar.js
для развертывания. Вы получите
(function() {
var x;
x = 'stringy string';
...
}).call(this);
(function() {
var x;
x = 42;
...
}).call(this);
Итак, x
in foo.coffee
и x
in bar.coffee
полностью изолированы друг от друга. Это важная часть CoffeeScript: Переменные никогда не течет из одного файла. Coffee в другой, если явно не экспортировано (путем присоединения к общему глобальному или к exports
в Node.js).
Вы можете переопределить это, используя флаг -b
( "голый" ) на coffee
, но это следует использовать только в особых случаях. Если вы использовали его в приведенном выше примере, то результат, который вы получили, будет
var x;
x = 'stringy string';
...
var x;
x = 42;
...
Это может иметь тяжелые последствия. Чтобы проверить это самостоятельно, попробуйте добавить setTimeout (-> alert x), 1
в foo.coffee
. И обратите внимание, что вам не нужно конкатенировать два JS файла самостоятельно - если вы используете два отдельных тега <script>
для их включения на страницу, они все равно эффективно запускаются как один файл.
Выделяя области разных модулей, компилятор CoffeeScript избавляет вас от головной боли, беспокоясь о том, могут ли разные файлы в вашем проекте использовать одни и те же имена локальных переменных. Это обычная практика в мире JavaScript (см., Например, источник jQuery или почти любой плагин jQuery) -CoffeeScript просто заботится о это для вас.