2013-07-22 33 views
1

我正在尝试将Google新的分析API与使用Coffeescript模块的应用程序集成。我想将他们的代码转换为Coffeescript,但js2coffee.org的自动转换失败。我试图用手重写,但有一个我不明白的逗号。原JS代码:将Google新的通用跟踪代码转换为Coffeescript

(function (i,s,o,g,r,a,m){ 
    i['GoogleAnalyticsObject']=r; 
    i[r]=i[r] || function(){ 
    (i[r].q=i[r].q||[]).push(arguments) 
    }, // --------------------------------------- What is this comma? 
    i[r].l=1*new Date(); 
    a=s.createElement(o), 
    m=s.getElementsByTagName(o)[0]; 
    a.async=1; 
    a.src=g; 
    m.parentNode.insertBefore(a,m) 
})(window,document,'script','//www.google-analytics.com/analytics.js','ga'); 

翻译的CoffeeScript

((i, s, o, g, r, a, m) -> 
    i["GoogleAnalyticsObject"] = r 
    i[r] = i[r] or -> 
    (i[r].q = i[r].q or []).push arguments_ 

    i[r].l = 1 * new Date() 

    a = s.createElement(o) 
    m = s.getElementsByTagName(o)[0] 

    a.async = 1 
    a.src = g 
    m.parentNode.insertBefore a, m 
) window, document, "script", "//www.google-analytics.com/analytics.js", "ga" 

抛出错误arguments_ is not defined。这是有道理的,因为这不是变量名称。不知道如何通过手工翻译 - JS中的所有逗号都将我抛弃。

+0

这说这是一个js2coffee的错误。也许就是这样。尽管如此,仍然认为逗号使用很奇怪。 http://stackoverflow.com/questions/11847324/what-does-arguments-refer-to – SimplGy

回答

2

这只是一个comma operator

摘要

逗号运算符它的两个操作数(从左至右),并返回第二个操作数的值。
[...]
说明

,当你想在需要一个表达式的位置的多个表达式可以用逗号。此运算符最常用的用法是在for循环中提供多个参数。

这是逗号运算符的奇怪用法,但您必须记住您正在查看的JavaScript可能已被预处理器或两个预处理器所损坏,因此它不适合人类使用。逗号运算符通常只用于for循环,有时用在return中,当有人试图聪明时。

将JavaScript翻译为CoffeeScript时,您可以放心地用头脑中的分号替换该逗号。或者只是将JavaScript保留为JavaScript,因为:

  1. 这并不意味着您可以编辑或维护。
  2. 无论如何,它将全部是JavaScript。
+0

由于CoffeeScript是我的构建过程的一部分,我想根据构建环境为UA密钥和域动态交换不同的值,我认为转换为CoffeeScript是有道理的。 – SimplGy

相关问题