Javascript “什么是”呢;var _gaq=_gaq | |[]&引用;对于
Google Analytics中的异步跟踪代码如下所示: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 = ('
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也可以保留其值
_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(/*…*/)
时,如果依赖项已异步加载,我们现在不总是这样做,这是一种非常有趣的处理方式