我正在学习YUI并且偶尔会看到这个成语:
<script>
(function x(){ do abcxyz})();
</script>
为什么他们只是为了调用它而创建一个函数? 为什么不写:
<script>
do abcxyz
</script>
例如,请参阅here。
答案 0 :(得分:45)
他们正在利用closures。
简短说明:由于JS使用函数级作用域,因此您可以在函数中执行一系列操作并使其保留在该范围内。这对于调用不会破坏全局命名空间的代码很有用。它还允许一个人创建私有变量 - 如果你在匿名函数中声明一个变量并立即执行它,那么只有匿名函数内的其他代码才能访问该变量。
例如,假设我想创建一个全局唯一id生成器。有人可能会做这样的代码:
var counter = 0;
var genId = function()
{
counter = counter + 1;
return counter;
}
但是,现在任何人都可以搞乱计数器,现在我用两个变量(计数器和 genId )污染了全局命名空间
相反,我可以使用匿名函数来生成我的计数器函数:
var genId = function()
{
var counter = 0;
var genIdImpl = function()
{
counter = counter + 1;
return counter;
}
return genIdImpl;
}();
现在,我在全局命名空间中只有一个变量,这是有利的。更重要的是,现在可以安全地修改计数器变量 - 它只存在于匿名函数的范围内,因此只有函数genIdImpl(在同一范围内定义)才能访问它。
在YUI的示例代码中,他们只想执行不会污染全局命名空间的代码。
答案 1 :(得分:3)
他们想避免命名空间冲突。似乎是JS的一个好习惯。