Google Analytics 最初使用_gaq
[object Array]
. 将数组传递给函数在 JavaScript 中是通过引用传递对象。
(编辑:正如答案中所指出的,引用是按值传递的。有关在 JavaScript 中传递引用/值的更多详细信息,请参见https://stackoverflow.com/a/5314911/120521 。)
下面的代码使用 jQuery 等待 DOM 加载,然后附加一个事件,一旦用户更改字段,该change
事件将向 Google Analytics 发送虚拟页面浏览量。<input/>
var _gaq = _gaq || [];
_gaq.push(['_setAccount', _gAAccount]);
_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 Tracking = {
trackInputs: function ($, gaObject) {
var inputs = $('#signUp').find('input');
inputs.bind('change', function () {
gaObject.push(['_trackPageview', '/virtual/input']);
console.log(gaObject); // Outputs:
// [Array[2], Array[1], Array[2]]
// i.e. _setAccount, _trackPageview,
// and _trackPageview calls.
});
}
};
jQuery(document).ready(function($) {
Tracking.trackInputs($, _gaq);
});
// ... DOM begins below
但是,从上面的评论中可以看出,该trackInputs()
方法打印了“原始”数组。通常,Google Analytics 脚本所做的是将_gaq
数组更改为_gaq
对象并更改对象的推送原型,以便在向对象推送新调用时向 Google Analytics 服务器发出请求。
为什么这种改变也不是通过引用传递到的trackInputs()
?
我意识到加载的谷歌分析脚本将(或者会?)在Tracking.trackInputs()
定义之后发生,所以浏览器可能不理解它现在是一个[object object]
但会坚持认为它是原始的[object Array]
. 但是,那么它不再是参考,是吗?
(全局使用_gaq
对象(根本不将其传递给方法)可以解决问题,但我想了解为什么这不起作用。)