6

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

親クロージャーがなくても同じように機能しませんか?

4

2 に答える 2

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);
于 2012-10-31T08:01:53.663 に答える
3

同じ名前を使用して定義されたグローバル スコープ変数がない限り、同じように機能します。コードをクロージャーでラップすると、コードが独自のスコープに配置されるため、ページ上の他のコードから独立しています。

于 2012-10-31T08:02:16.990 に答える