2012-10-31 2 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

그것은 한 동일하게 작동 것 같은 이름을 사용합니다. 클로저에 코드를 배치하면 페이지의 다른 코드와 독립적이되도록 코드가 자체 범위에 배치됩니다.

관련 문제