抱歉回答晚了,但我阅读了已接受的答案,我认为它错过了最重要的事情。所以我会试着解释我的理解:
首先,已经解释了,但答案需要完整,所以我也解释一下,代码开头:
var _gaq = _gaq || [];
它确保 _gaq 已定义。如果未定义,则将其初始化为空数组。
把它想象成等价的:
var _gaq;
/* ... */
if(!_gaq)
_gaq = [];
javascript 值undefined是“falsish”/“falsy”,即它在转换为布尔值时评估为false,因此[] 在这种情况下初始化_gaq 。
需要注意的是:
- 如果 _gaq 在此阶段包含一个数组,则 _gaq 是“真实的”,因此它将保留它的值(并且不会被清空)
- 如果_gaq在这个阶段包含另一种类型的对象,_gaq也可以保持它的值
好吧,我尽可能地重新解释了已经解释过的内容。大多数使用过 javascript 的人已经理解了它。然而,有趣的部分不仅仅是开始!
_gaq.push(['command', 'argument']); // is very interesting too
如果 _gaq 是一个数组,大家都会猜到这个 item['command', 'argument']是追加到数组中的。谷歌分析将其存储在其队列中以供进一步处理。数组 _gaq 用作队列。
但真正有趣的部分是_gaq.push(/*...*/)可以在没有名为 _gaq 的数组的情况下完成。它只是一个方法调用,非数组也可以有一个“ push”方法。
它“开辟了新的可能性”。这是一个总结:
- 只要不异步加载外部javascript文件,_gaq就是一个用作队列的数组。
- 然后外部 ga.js 处理队列。
- 然后 ga.js 将 _gaq 替换为一个提供 push 方法的对象。
- 一旦 _gaq 被一个对象替换,
_gaq.push(/*...*/)命令就不需要再延迟了,它们可以被执行。
对于那些错过了异步脚本加载部分的人来说,它是:
(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);
})();
临时使用数组作为队列和 push 方法是很棒的代码。这是一种非常有趣的方式来处理这样一个事实,即在_gaq.push(/*...*/)执行时,我们并不总是现在是否已经异步加载依赖项。
管理此类问题的另一个相关有趣的方法是新的 Google Analytics“isogram”片段:ga(/*...*/)看起来更直观的调用 that _gaq.push(/*...*/),但它仍然以异步方式处理与加载依赖项相关的乐趣。
谁能解释一下这是干什么用的?
我希望我上面的回答已经做到了。我想在这里分享的是,第一行以一种特殊的方式完成以适应整个事情:如果完成两次就不会伤害初始化,巧妙地使用推送方法......
Google Analytics 是否依赖名为 _gaq 的全局对象?
是的,当使用这个 ga.js 片段时。