16

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

 <script>
     (function x(){ do abcxyz})();
 </script>

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

<script>
    do abcxyz
</script>

例如看这里

4

2 回答 2

45

他们正在利用闭包

一个简短的解释:由于 JS 使用函数级别的作用域,你可以在一个函数中做一堆动作,并让它保持在那个作用域内。这对于调用不会与全局命名空间混淆的代码很有用。它还允许创建私有变量 - 如果您在匿名函数内部声明一个变量并立即执行它,那么只有匿名函数内部的其他代码才能访问该变量。

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

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

但是,现在任何人都可以弄乱counter,而我现在已经用两个变量(countergenId)污染了全局命名空间。

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

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

    return genIdImpl;
}();

现在,我在全局命名空间中只有一个变量,这是有利的。更重要的是,counter 变量现在可以安全地被修改——它只存在于匿名函数的作用域中,因此只有函数 genIdImpl(在同一作用域中定义)可以访问它。

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

于 2009-03-30T18:53:54.693 回答
3

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

于 2009-03-30T18:56:47.277 回答