什么是“var _gaq = _gaq ||” ; “为?

Google Analytics中的asynchronous跟踪代码如下所示:

var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-XXXXX-X']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); 

关于第一行:

 var _gaq = _gaq || []; 

我认为它确保如果_gaq已经被定义,我们应该使用它,否则我们应该是一个数组。

任何人都可以解释这是什么?

另外,如果_gaq被重命名,这是否重要? 换句话说,Google Analytics(分析)是否依赖名为_gaq的全局对象?

是的,它确保_gaq被定义,所以_gaq.push()永远不会失败。

我不会在GA的代码中弄乱variables的名字…你有什么理由要这样做吗? 它与你的任何variables有冲突吗? (然后我会改变我的…)

这行是在同一页面允许多个GA片段。 它确保第二个片段不会覆盖第一个定义的_gaq。

GAasynchronous跟踪首先将_gaq定义为一个数组。 这个数组的行为就像一个队列,它允许你推送(追加)configuration和跟踪“命令”(比如_trackPageview)到队列末尾。 你的命令存储在这个数组中,直到ga.js完全下载。

当ga.js准备就绪时,它将执行_gaq数组中的所有命令,并用一个对象replace_gaq。 这个对象也有一个push方法,但是不用排队命令,而是立即执行,因为ga.js可以处理它们。

这种机制允许你在不知道浏览器是否完成下载ga.js的情况下进行configuration和跟踪命令。 这是因为asynchronous片段下载ga.js而不阻止页面上的其他代码运行。 如果其他代码(你的configuration命令)需要知道被下载的ga.js的状态,事情会变得毛茸茸的。

所有这一切绝对取决于名称_gaq的使用。 如果你想asynchronous跟踪工作,你不应该试图命名它。

使用|| 分配是一种常见的编程技巧,它利用了操作员的评估方向,从左到右。 这意味着它首先评估左侧。 那么, 只有这样做是错误的 (或者是一个错误的等价物),它才会评估正确的一面。

你也可以利用||&&操作符在一个简单的if语句中,以便

 if (a > 5) { do_a(); } if (!some_boolean) { do_b(); } 

成为

 a > 5 && do_a(); some_boolean || do_b(); // Note that the negation operator `!` is gone! 

这是更好的看看。

语言允许这样做的原因是因为如果左侧会使整条线路无法正常工作,那么评估右侧是浪费时间。 所以它只是忽略它,除非需要。

编辑:

我会添加更多的细节

_gaq就是第一个定义的简单的javascript数组。 你添加事件,如事件跟踪callback

当ga.js脚本被加载的时候,google会把这个数组变成一个对象。

这就是为什么你将函数推入_gaq数组,然后在你之后调用ga.js脚本;重新构build数组。

gaq是谷歌分析队列。 它是GA方法的堆栈,比如事件跟踪,页面归属等等,你使用push()方法把GA的东西放在那里。 减less事件干扰,每个人都应该这样做,或者至less学习这个概念。

对不起,我迟到了,但我读了接受的答案,我认为它错过了最重要的事情。 所以我会试着解释我所理解的:

首先已经解释了,但是答案需要完整,所以我也解释一下,代码开始于:

 var _gaq = _gaq || []; 

它确保_gaq被定义。 如果未定义,则将其初始化为空数组。

认为它像相当于:

 var _gaq; /* ... */ if(!_gaq) _gaq = []; 

undefined的javascript值是“falsish”/“falsy”,即当转换为布尔值时它的计算结果为false,所以_gaq在这种情况下用[]初始化。

重要的是要注意的是:

  • 如果_gaq在这个阶段包含一个数组,_gaq是“trueish”,所以它会保持它的值(而不是空的)
  • 如果_gaq在这个阶段包含另一种types的对象,_gaq也可以保留它的值

那么,我已经解释了,我已经解释了。 大多数使用javascript的人都已经明白了。 但是,有趣的部分不仅是开始!

 _gaq.push(['command', 'argument']); // is very interesting too 

如果_gaq是一个数组,那么你都会猜测这个数组['command', 'argument']被追加到数组中。 谷歌分析将其存储在队列中以供进一步处理。 数组_gaq被用作队列。

但是真正有趣的部分是_gaq.push(/*...*/)可以在没有名为_gaq的数组的情况下完成。 这只是一个方法调用,非数组也可以有一个“ push ”的方法。

它“开辟了新的可能性”。 这里是一个总结:

  • 只要外部JavaScript文件不是asynchronous加载的,_gaq就是一个用作队列的数组。
  • 外部ga.js然后处理队列。
  • ga.js然后用提供推送方法的对象replace_gaq。
  • 一旦_gaq被一个对象replace, _gaq.push(/*...*/)命令就不需要被延迟了,它们可以被执行。

对于那些错过了asynchronous脚本加载部分的人来说,它是:

 (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })(); 

临时使用一个数组作为队列,推送方法是伟大的代码。 这是一个非常有趣的方式来处理_gaq.push(/*...*/)被执行的时候,如果依赖已经被asynchronous加载了,我们并不总是现在。

另一个相关的pipe理这种问题的有趣方法是新的Google Analytics(分析)“isogram”片段 : ga(/*...*/)对于_gaq.push(/*...*/)调用看起来更加直观,但它仍然可以应付与以asynchronous方式加载依赖关系有关的乐趣。

任何人都可以解释这是什么?

我希望我的回答已经完成了。 我想在这里分享的是,第一行是以一种特殊的方式完成的,以适应整个事情:如果做了两次,永不伤害的初始化,聪明的使用推式方法…

Google Analytics(分析)是否依赖名为_gaq的全局对象?

是的,当使用这个ga.js片段。

是的,它的确如你所想的那样:)这是一个简写

 if(!_gaq){ var _gaq = [] } 

这意味着如果_gaq已经被定义了,那就使用它来声明一个空数组。 推,你可以覆盖设置。 如果_gaq对象之后没有定义2个“行”,则会导致错误。

是的,_gaq对象是在代码中包含的脚本(ga.js)。