Javascript作用域在coffeescript为谷歌分析代码

Javascript scopes in coffeescript for Google Analytics Code

本文关键字:代码 谷歌 作用域 coffeescript Javascript      更新时间:2023-09-26

Google Analytics的代码使用全局_gaq对象作为分析命令。他们建议检查这样的对象是否已经存在,像这样:

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

在CoffeeScript中,它看起来像这样:

_gaq = _gaq or []

编译成:

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

我怎么能写一个CoffeeScript代码,将导致上述Javascript的行为?

要使_gaq变量在全局作用域中可用,您可以在coffeescript中这样写:

_gaq = window._gaq ?= []

javascript输出:

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

这样以后可以调用_gaq.push(['_trackPageview']);

在stackoverflow中还有一个关于coffeescript中全局变量的问题,你可能想检查一下

如果变量不存在,可以有条件地为它赋值:

window._gaq ?= []

这里有两件棘手的事情:

  1. 注意我引用的是window._gaq。Google Analytics JavaScript将_gaq对象直接附加到window对象上。更多信息请参见:http://coffeescript.org/#lexical-scope

  2. 观察?=操作符。这是CoffeeScript的存在运算符,它提供了比||=更安全的条件赋值。欲了解更多信息,请谷歌"CoffeeScript存在运算符"。(我想直接链接你,但我不能发布另一个链接,因为我还没有足够的声望点。)

最后,我把一个要点放在一起,我使用谷歌分析跟踪在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);