GoogleAnalyticsは最初にを使用し_gaq
[object Array]
ます。関数に配列を渡すことは、JavaScriptでオブジェクトを渡すことであり、したがって参照によるものです。
(編集:回答で指摘されているように、参照は値によって渡されます。JavaScriptでの参照/値の受け渡しの詳細については、https://stackoverflow.com/a/5314911/120521を参照してください。)
以下のコードは、jQueryを使用してDOMが読み込まれるのを待ちchange
、ユーザーがフィールドを変更すると仮想ページビューをGoogleAnalyticsに送信するイベントをアタッチし<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
オブジェクトに変更し、オブジェクトのプッシュプロトタイプを変更して、新しい呼び出しがオブジェクトにプッシュされたときにGoogleAnalyticsサーバーにリクエストを送信するようにします。
この変更も参照によってに渡されないのはなぜtrackInputs()
ですか?
ロードされたGoogleAnalyticsスクリプトはTracking.trackInputs()
定義の後に発生する(または発生するのでしょうか?)ので、ブラウザはそれが現在ではあることを理解できない可能性があります[object object]
が、元のスクリプトであると考え続け[object Array]
ます。しかし、それはもはや参照ではありませんね?
(_gaq
オブジェクトをグローバルに使用する(メソッドにまったく渡さない)と問題は解決しますが、なぜこれが機能しないのかを理解したいと思います。)