Javascript “什么是”呢;var _gaq=_gaq | |[]&引用;对于

Javascript “什么是”呢;var _gaq=_gaq | |[]&引用;对于,javascript,google-analytics,Javascript,Google Analytics,Google Analytics中的异步跟踪代码如下所示: 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 = ('

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

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 || []; 
我认为它确保了如果已经定义了
\u gaq
,我们应该使用它,否则我们应该创建一个数组

有人能解释一下这是干什么用的吗


另外,如果
\u gaq
被重命名,这有关系吗?换句话说,Google Analytics是否依赖名为
\u gaq
的全局对象?

是的,它确保定义了
\u gaq
,这样
\u gaq.push()
就不会失败


我不会弄乱GA代码中变量的名称。。。你有什么理由这么做吗?它是否与您的任何变量冲突?(然后我将更改我的…

这意味着,如果已经定义了_gaq,则使用它,否则它将声明一个空数组。使用push,您可以覆盖设置。如果没有定义_gaq对象,那么后面的2条“行”将导致错误


是的_gaq对象应该出现在脚本中,您将其包含在那里的代码(ga.js)中。

是的,它完全按照您认为的那样工作:) 这是英语的简写

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

在赋值中使用
|
是一种常见的编程技巧,它利用了运算符的求值方向(从左到右)。这意味着它首先计算左侧。然后,仅当该值为假时(或假等效值),它才会计算右侧

您还可以在一个简单的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!
这两种方式都更好看


语言允许这样做的原因是,如果左侧会使整条线路出现故障,那么评估右侧是浪费时间的。因此,除非需要,否则它会忽略它。

这一行允许在同一页中包含多个GA片段。它确保第二个代码段不会覆盖第一个代码段定义的_gaq

GA异步跟踪首先将_gaq定义为一个数组。此数组的作用类似于队列,它允许您将配置和跟踪“命令”(如_trackPageview)推送到队列的末尾。在ga.js完全下载之前,您的命令将存储在此数组中

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

此机制允许您在不知道浏览器是否已完成下载ga.js的情况下执行配置和跟踪命令。这是必需的,因为异步代码段下载ga.js时不会阻止页面上的其他代码运行。如果其他代码(您的配置命令)需要知道正在下载的ga.js的状态,事情就会变得棘手

所有这些都完全取决于名称的使用。如果希望异步跟踪工作,则不应尝试命名它。

编辑:

我将补充更多细节

_正如最初定义的那样,gaq只是一个javascript数组。您可以向其中添加事件,例如事件跟踪回调

然而,当加载ga.js脚本时,google会将该数组转换为ga使用的对象

这就是为什么要将函数推入_gaq数组,然后在之后调用ga.js脚本;我们完成了数组的构建


gaq是谷歌分析队列。它是GA方法的堆栈,如事件跟踪、页面属性等。您可以使用push()方法将GA内容放在上面。减少事件干扰,每个人都应该这样做,或者至少学习这个概念。

很抱歉回答晚了,但我阅读了公认的答案,我认为它忽略了最重要的事情。因此,我将尝试解释我所理解的内容:

首先,它已经解释过了,但答案需要完整,所以我也解释过,代码从:

var _gaq = _gaq || [];
它确保定义了_gaq。如果未定义,则将其初始化为空数组

你可以这样想:

var _gaq;
/* ... */
if(!_gaq)
  _gaq = [];
javascript值
未定义
为“falsish”/“falsy”,即当转换为布尔值时,它的计算结果为false,因此在这种情况下_gaq被初始化为
[]

需要注意的是:

  • 如果在这个阶段_gaq包含一个数组,_gaq是“trueish”,因此它将保留它的值(并且不会被清空)
  • 如果_gaq在此阶段包含另一种类型的对象,_gaq也可以保留其值
我尽我所能重新解释了一些已经解释过的事情。大多数有javascript经验的人都已经理解了这一点然而,有趣的部分不仅仅是开始

_gaq.push(['command', 'argument']); // is very interesting too
如果_gaq是一个数组,那么大家都会猜测该项
['command','argument']
被附加到数组中。Google analytics将其存储在队列中以供进一步处理。数组_gaq用作队列

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

它“开启了新的可能性”。以下是其中一项的总结:

  • 只要外部javascript文件不是异步加载的,_gaq就是用作队列的数组
  • 然后外部ga.js处理队列
  • 然后,ga.js用一个提供push方法的对象替换_gaq
  • 一旦用对象替换了_gaq,
    \u 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方法是非常好的代码。当执行
\u gaq.push(/*…*/)
时,如果依赖项已异步加载,我们现在不总是这样做,这是一种非常有趣的处理方式