2012-10-31 18 views
6

爲什麼在谷歌分析跟蹤代碼中,他們是否將這些行封裝在閉包中?在谷歌分析跟蹤代碼中,爲什麼他們使用閉包

(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); 
})(); 

如果沒有父關閉,它不會工作嗎?

+3

這是爲了避免使用'ga'和's'變量來污染全局名稱空間。 – AKX

回答

7

它的工作原理是一樣的,但如果您已經在Google代碼中使用了一個標識符聲明瞭一個變量,那麼它可能會輕易地破壞您網頁上的其他腳本。

通過將聲明封裝在閉包中,變量被限定爲匿名函數,並且不泄漏到全局範圍。

例如,考慮這個例子與新的範圍:

var ga = "something important for my script"; // Not overwritten in this scope 

(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 ga = "something important for my script"; // Overwritten! 

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); 
3

它的工作一樣,只要有定義沒有全局範圍變量使用相同的名稱。在一個閉包中包裝代碼將它放在它自己的作用域中,以便它獨立於頁面上的任何其他代碼。