我已經解剖下面的代碼段,用於異步加載Segment.io分析包裝腳本:爲什麼Segment.io加載程序腳本將方法名/參數推送到似乎被覆蓋的隊列上?
// Create a queue, but don't obliterate an existing one!
var analytics = analytics || [];
// Define a method that will asynchronously load analytics.js from our CDN.
analytics.load = function(apiKey) {
// Create an async script element for analytics.js.
var script = document.createElement('script');
script.type = 'text/javascript';
script.async = true;
script.src = ('https:' === document.location.protocol ? 'https://' : 'http://') +
'd2dq2ahtl5zl1z.cloudfront.net/analytics.js/v1/' + apiKey + '/analytics.min.js';
// Find the first script element on the page and insert our script next to it.
var firstScript = document.getElementsByTagName('script')[0];
firstScript.parentNode.insertBefore(script, firstScript);
// Define a factory that generates wrapper methods to push arrays of
// arguments onto our `analytics` queue, where the first element of the arrays
// is always the name of the analytics.js method itself (eg. `track`).
var methodFactory = function (type) {
return function() {
analytics.push([type].concat(Array.prototype.slice.call(arguments, 0)));
};
};
// Loop through analytics.js' methods and generate a wrapper method for each.
var methods = ['identify', 'track', 'trackLink', 'trackForm', 'trackClick',
'trackSubmit', 'pageview', 'ab', 'alias', 'ready'];
for (var i = 0; i < methods.length; i++) {
analytics[methods[i]] = methodFactory(methods[i]);
}
};
// Load analytics.js with your API key, which will automatically load all of the
// analytics integrations you've turned on for your account. Boosh!
analytics.load('MYAPIKEY');
它是很好的註釋,我可以看到它在做什麼,但我很困惑,當談到到methodFactory
函數,該函數將主要analytics.js
腳本加載到全局analytics
陣列之前進行的任何方法調用的詳細信息(方法名稱和參數)推送。
這是一切都很好,但隨後如果/當主腳本確實負載,它似乎只是覆蓋全球analytics
變量(見last line here),因此所有數據都將丟失。
我怎麼看這樣可以防止腳本錯誤在網頁中通過測試框架哪些目前還不存在的方法,但我不明白爲什麼存根不能只返回一個空的功能:
var methods = ['identify', 'track', 'trackLink', 'trackForm', 'trackClick',
'trackSubmit', 'pageview', 'ab', 'alias', 'ready'];
for (var i = 0; i < methods.length; i++) {
lib[methods[i]] = function() { };
}
我錯過了什麼?請幫我理解!
太棒了!謝謝你解釋,伊恩,我期待着博客文章。我認爲這將是一些沿着這些方向的東西,但是本地到全球的位置給我帶來了刺激,再加上我不能(也不能)看到一段實際上在任何地方實際應用這些呼叫的代碼。 這是特定於Segment.io而不是標準analytics.js庫代碼的東西,還是我只是想念它? – 2013-02-19 22:06:51
嗯,它是特定於Segment.io上的片段。如果您使用的是獨立版本,則不會異步加載庫,因此您無需重播隊列。 – 2013-02-19 23:36:03
對,現在有道理! – 2013-02-20 05:16:58