Функции в кофейном файле недоступны с других js

Я пытаюсь использовать coffeescript в моем Grails-проекте. Чтобы достичь этого, я решил использовать плагин coffeescript-resources. Но скомпилированный кофе в представлении результатов выглядит следующим образом:

(function() {
    var someFunc;
    someFunc = function() {
       return alert("hello");
    };
}).call(this); 

и в этом случае я не могу это назвать. Я не нашел надлежащих конфигураций в документации плагина, чтобы избежать использования анонимных функций при компиляции coffee-файла. Как я могу решить это?

1 ответ

Решение

Из прекрасного руководства:

Лексический обзор и переменная безопасность
[...]
Хотя для ясности эта документация исключена из этой документации, все выходные данные CoffeeScript заключены в анонимную функцию: (function(){ ... })(); Эта защитная оболочка в сочетании с автоматической генерацией var ключевое слово, чрезвычайно затрудняет случайное загрязнение глобального пространства имен.

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

Таким образом, существует самозапускающаяся функция-обертка, которая предотвращает загрязнение глобального пространства имен. Если вы хотите поместить что-то в глобальное пространство имен, тогда вы должны поместить это туда явно; в браузере вы можете сделать это используя:

window.someFunc = -> alert('hello')

или же

@someFunc = -> alert('hello')

@someFunc Форма предполагает, что вы находитесь в верхней части области (то есть не внутри другой функции или класса).

Кроме того, вы можете найти способ скомпилировать ваш CoffeeScript с --bare:

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

Другие вопросы по тегам