奇怪的JavaScript语法如下:(function(){// code})();?

Strange JavaScript syntax like this: (function(){//code}) ();?


以下JavaScript是什么意思? 为什么函数嵌入在()中?

1
2
3
4
(function() {
    var b = 3;
    a += b;
}) ();



它的功能相当于做类似的事情:

1
2
3
4
5
6
var myFunc = function(){
    var b = 3;
    a += b;
};

myFunc();


它周围有括号(和尾随),以便立即调用该函数。正如其他人所说,这个概念被称为匿名函数。



这是一个匿名函数,它在创建之后才会触发。



它是一个匿名函数。

Anonymous functions are functions that
are dynamically declared at runtime
that don’t have to be given a name.

Anonymous functions are declared using
the function operator. You can use the
function operator to create a new
function wherever it’s valid to put an
expression. For example you could
declare a new function as a parameter
to a function call or to assign a
property of another object.


进一步阅读


Javascript匿名函数

Anonymous functions can help make code
more concise when declaring a function
that will only be used in one place.
Rather than having to declare the
function and then use it you can do
both in one step. It’s particularly
useful for things like declaring event
handlers and assigning methods to
objects.


例如,如果我们要创建一个构造函数,我们需要声明对象的方法,然后将它们分配给对象的属性,以便可以在对象外部调用它们。可以声明该函数,然后将其作为单独的步骤分配给变量,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
function Pet(name, species, hello)
{    
          this.name = name;    
          this.species = species;    
          this.hello = hello;

          function sayHello()    
          {    
              alert(this.hello);    
          }

          this.sayHello = sayHello;    
      }


但这样做更方便,更简洁:

1
2
3
4
5
6
7
8
9
10
11
 function Pet2(name, species, hello)
 {
      this.name = name;    
      this.species = species;    
      this.hello = hello;

      this.sayHello = function()      
      {    
          alert(this.hello);    
      }    
  }



你写的是一个立即调用的匿名函数。
这样做的原因是使用私有变量。如果代替您的代码,将会:

1
2
var b = 3;
a += b;


b将是全局变量。因此,如果您需要全局代码私有变量,那就是这样做的方法。



贾斯汀的回答很好地解释了,但我想我只是补充说,就程序执行而言,第一组括号(function之前的开头)实际上是完全没有必要的。但是为了便于阅读,这非常重要!当我看到这个:

1
(function() {


我知道立即调用此函数,而不必向下滚动以找到块的结尾。这很重要,因为有时您希望将函数的返回值赋给变量,有时您希望将函数赋值给变量。看到:

1
2
3
4
5
6
7
8
9
10
var x = (function() {
    return 4;
})();

var y = function() {
    return 4;
};

// typeof x == integer (4)
// typeof y == function


javascript中的函数是对象,也可以用作对象。例如,您可以这样做:

1
2
var a = function() {alert("done");};
a();


这通常用在各种函数中,你必须在里面传递一些逻辑。例如,数组的"sort"函数需要在内部传递函数对象以确定如何对数组进行排序:

1
2
3
4
5
6
7
8
var a = [{id: 15, name: 'test'},
         {id: 11, name: 'asd'},
         {id: 88, name: 'qweqwe'}];
a.sort(function(a,b) {
    if (a.id > b.id) return 1; //Put a after b
    if (a.id < b.id) return -1; //Put a before b
    if (a.id == b.id) return 0; //Don't make no changes
});


然后'sort'方法调用提供的函数和各种数组元素来对其进行排序。


你的例子做了什么 - 它创建了一个函数对象,并立即运行它。



它是一个匿名函数,在创建后直接调用,然后丢弃。


它位于括号内以防止语法错误。如果没有括号,关键字function后面必须跟一个标识符。


你也可以这样做把函数放在一个变量中,然后调用它:

1
2
3
4
5
var x = function() {
   var b = 3;
   a += b;
}
x();


请注意,当function关键字不是第一个时,不需要括号。



这是在适当位置执行的匿名函数。最好的用法是设置一些上下文或环境设置或对加载有一些副作用。


Ajax Toolkits(如JQuery,Dojo等)大量使用它来执行加载时间魔术并解决许多浏览器怪癖和缺点。