2012-10-31 18 views
6

なぜGoogleアナリティクストラッキングコードでこれらの行をクロージャで折り返しますか?Googleアナリティクスのトラッキングコードで、クロージャを使用する理由

(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

それは限り定義されたグローバルスコープ変数が存在しないと同じように動作します同じ名前を使用します。クロージャーでコードをラップすると、ページ上の他のコードとは独立したコードになります。

関連する問題