JavaScript习惯用法:只创建一个函数来调用它

我正在学习YUI并偶尔看到这个成语:

 (function x(){ do abcxyz})();  

为什么他们创建一个函数只是为了调用它? 为什么不写:

  do abcxyz  

例如,请看这里 。

他们正在利用封闭装置 。

简短说明:由于JS使用函数级作用域,因此您可以在函数中执行一系列操作并使其保留在该范围内。 这对于调用不会破坏全局命名空间的代码很有用。 它还允许一个人创建私有变量 – 如果你在匿名函数内声明一个变量并立即执行它,那么只有匿名函数内的其他代码才能访问该变量。

例如,假设我想创建一个全局唯一的id生成器。 有人可能会做这样的代码:

 var counter = 0; var genId = function() { counter = counter + 1; return counter; } 

但是,现在任何人都可以搞乱计数器 ,我现在用两个变量( countergenId )污染了全局命名空间。

相反,我可以使用匿名函数来生成我的计数器函数:

 var genId = function() { var counter = 0; var genIdImpl = function() { counter = counter + 1; return counter; } return genIdImpl; }(); 

现在,我在全局命名空间中只有一个变量,这是有利的。 更重要的是,计数器变量现在不会被修改 – 它只存在于匿名函数的作用域中,因此只有函数genIdImpl(在同一作用域中定义)才能访问它。

看起来在YUI的示例代码中,他们只想执行根本不污染全局命名空间的代码。

我猜他们想避免命名空间冲突。 似乎是JS的一个好习惯。