为什么许多javascript库以“(function(){”开头?

时间:2009-12-24 13:47:21

标签: javascript

为什么许多javascript库看起来像这样:

(function () { 
    /* code goes here */ 
})();

它似乎定义了一个立即调用的未命名函数。为什么要经历这种努力呢?

5 个答案:

答案 0 :(得分:17)

这是在JavaScript中执行命名空间的标准方法。如果您只是声明

var my_cool_variable = 5;

它将是全局的,并且可能与使用相同变量的其他库冲突。

但是,如果你这样做

(function() {
    var my_cool_variable = 5;
})();

它现在是匿名函数的局部变量,在该函数范围之外是不可见的。您仍然可以通过不在变量前面声明var来公开可访问的API,这样它将是全局的,但现在您可以选择。

答案 1 :(得分:7)

如果力量范围声明。通过将它放在一个函数中,您可以确保您创建和调用的变量没有被重新声明,或者您不会意外地调用在其他地方声明的变量。

所以.....

var variable = 5; // this is accessible to everything in the page where:

function ()
{
   var variable = 7 // this is only available to code inside the function.
}

以下是Douglas Crockford网站上有关Javascript范围的链接:

http://javascript.crockford.com/code.html

跟进以下评论:

JavaScript的范围有点“破碎”:

function ()
{
   var x = 3;  // accessible in the entire function.
   //for scope reasons, it's better to put var y = 8 here.....
   if(x != 4)
   {
       var y = 8; //still accessible in the entire function. 
                  //In other languages this wouldn't be accessible outside 
                  //of the if statement, but in JavaScript it is.  

   }

}

答案 2 :(得分:2)

在简单的层面上,它保持全局命名空间的清洁(呃)。

即:它有效地在库中的函数和变量周围添加了一层包装,从而确保没有任何命名空间与其他库中可能正在使用的其他函数冲突等。

答案 3 :(得分:1)

JavaScript没有块范围,只有函数范围。通过创建并立即调用匿名函数,我们可以保证其局部变量不会遍历全局命名空间。它基本上是一种限制与其他可能存在的库的冲突的方法。

答案 4 :(得分:0)

var $={} // a name space is defined 

(function($) {
        $.a_variable="some vale"
        var b_variable = "some more value";
})($);

$.a_variable // acess it like this.

现在,匿名函数中的任何内容都只具有与该函数相同的范围 我们也可以创建可以作为名称空间属性的对象。