在Google分析跟踪代码中,为什么要使用闭包?

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
为避免在全局命名空间中污染 gas 变量。 - AKX
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);

3
只要没有使用相同名称定义的全局作用域变量,它将起作用。将代码包装在闭包中会将其放置在自己的作用域中,使其独立于页面上的任何其他代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接