我正在学习YUI,偶尔会看到这个成语:
<script>
(function x(){ do abcxyz})();
</script>
为什么他们创建一个函数只是为了调用它?为什么不直接写:
<script>
do abcxyz
</script>
例如看这里。
他们正在利用闭包。
一个简短的解释:由于 JS 使用函数级别的作用域,你可以在一个函数中做一堆动作,并让它保持在那个作用域内。这对于调用不会与全局命名空间混淆的代码很有用。它还允许创建私有变量 - 如果您在匿名函数内部声明一个变量并立即执行它,那么只有匿名函数内部的其他代码才能访问该变量。
例如,假设我想制作一个全局唯一 id 生成器。一个人可能会做这样的代码:
var counter = 0;
var genId = function()
{
counter = counter + 1;
return counter;
}
但是,现在任何人都可以弄乱counter,而我现在已经用两个变量(counter和genId)污染了全局命名空间。
相反,我可以使用匿名函数来生成我的计数器函数:
var genId = function()
{
var counter = 0;
var genIdImpl = function()
{
counter = counter + 1;
return counter;
}
return genIdImpl;
}();
现在,我在全局命名空间中只有一个变量,这是有利的。更重要的是,counter 变量现在可以安全地被修改——它只存在于匿名函数的作用域中,因此只有函数 genIdImpl(在同一作用域中定义)可以访问它。
看起来在 YUI 的示例代码中,他们只想执行完全不污染全局命名空间的代码。
我猜他们想避免命名空间冲突。似乎是 JS 中的一个好习惯。