什么是“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)。
- 在点击表单提交后,在Google分析中跟踪事件
- GoogleAnalyticsTracker.getInstance()时出现NoClassDefFoundError
- 如何在不使用插件的情况下使用Google Analytics和PhoneGap?
- 是否有可能跟踪谷歌链接像谷歌分析页面?
- Google Analytics(分析)有更快的select吗?
- 插入Google Analytics(分析)代码的最佳位置
- 如何从Google Analytics中删除媒体资源
- Chrome扩展程序将外部JavaScript添加到当前页面的HTML
- 尝试安装新的Google Analytics 3.0testing版时出现链接错误