2014-10-11 37 views
0

當安裝谷歌分析他們的代碼(通用Analytics)的最新版本如下:Google Analytics JavaScript如何在沒有異步/爭用條件問題的情況下加載並運行?

(function(i, s, o, g, r, a, m) { 
    i['GoogleAnalyticsObject'] = r; 
    i[r] = i[r] || function() { 
     (i[r].q = i[r].q || []).push(arguments) 
    }, i[r].l = 1 * new Date(); 
    a = s.createElement(o), m = s.getElementsByTagName(o)[0]; 
    a.async = 1; 
    a.src = g; 
    m.parentNode.insertBefore(a, m) 
})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); 

ga('create', 'UA-XXXXXXX-X', 'auto'); 
ga('send', 'pageview'); 

代碼的第一部分是創建一個<script>標記加載analytics.js,那麼第二部分採用ga()功能激活腳本。

我的問題是 - 如果加載analytics.js需要一些時間,ga()函數在被執行之前如何知道要等待?爲什麼ga()在腳本加載之前嘗試運行?

我想使用類似的機制,並希望更好地理解谷歌的代碼將有所幫助。

+0

我在進一步研究後發現此問題http://stackoverflow.com/questions/23474151/how-is-the-google-analytics-tracking-code-working-async-method-call?rq=1 which那種回答我的問題 – jones 2014-10-11 10:44:12

回答

3

ga.js代碼庫中比在這裏更清楚,但它是完全相同的原理。

  1. 創建一個空的陣列(認爲它作爲一個隊列)
  2. 推命令此數組
  3. 一旦JS文件的負載,通過陣列運行和執行這些命令
  4. 最後,覆蓋該推壓到陣列方法來解析&執行命令

對於analytics.js這幾乎是同樣的事情,但包裹在一個函數(其可以被重命名)。爲了回答你的問題,你發送的鏈接幾乎總結了它,但爲了清楚起見:由於代碼塊包含臨時解決方案的初始化(將命令推送到數組但不實際執行命令),所以存在ga(),因此將運行沒有錯誤。

相關問題