Области применения Javascript в coffeescript для кода Google Analytics

Коды для Google Analytics используют глобальный _gaq объект для команд аналитики. Они советуют проверить, существует ли такой объект, вот так:

var _gaq = _gaq || [];
// Command
_gaq.push(['_trackPageview']);

В CoffeeScript это будет выглядеть так:

_gaq = _gaq or []

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

(function() {
    var _gaq;
    _gaq = _gaq || [];
}).call(this);

Как я могу написать код CoffeeScript, который приведет к поведению вышеупомянутого Javascript?

3 ответа

Решение

Чтобы сделать _gaq переменная доступна в глобальной области видимости, вы можете написать это в coffeescript:

_gaq = window._gaq ?= []

Вывод JavaScript:

var _gaq, _ref;
_gaq = (_ref = window._gaq) != null ? _ref : window._gaq = [];

Таким образом, вы можете позже позвонить _gaq.push(['_trackPageview']);

Есть еще один вопрос в stackru, в котором говорится о глобальных переменных в coffeescript, которые вы, возможно, захотите проверить.

Вы можете условно присвоить значение переменной, если оно не существует элегантно, как это:

window._gaq ?= []

Здесь происходят две хитрые вещи:

  1. Обратите внимание, что я ссылаюсь window._gaq, JavaScript Google Analytics придает _gaq объект прямо на window объект. Для получения дополнительной информации см.: http://coffeescript.org/

  2. Соблюдайте ?= оператор. Это экзистенциальный оператор CoffeeScript, который обеспечивает более безопасное условное присвоение, чем ||=, Для получения дополнительной информации, Google для "экзистенциальный оператор CoffeeScript". (Я бы связал вас напрямую, но я не могу опубликовать другую ссылку, потому что у меня пока недостаточно очков репутации.)

Наконец, я собрал суть, которую я использую для отслеживания Google Analytics в CoffeeScript здесь: https://gist.github.com/brainix/4394158

Вы могли бы сделать:

_gaq?.push ['_code']

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

// Generated by CoffeeScript 1.6.2
(function() {
  if (typeof _gaq !== "undefined" && _gaq !== null) {
    _gaq.push(['_code']);
  }

}).call(this);
Другие вопросы по тегам