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

奇怪的JavaScript语法如下:(function(){//code}();?,javascript,function,Javascript,Function,下面的JavaScript是什么意思?为什么函数嵌入在()中 这是一个匿名函数,在创建后立即激发。这是一个匿名函数 匿名函数是 在运行时动态声明 不必给它起名字 匿名函数是使用 函数运算符。你可以使用 函数运算符创建一个新的 函数,只要可以将 表情。例如,你可以 将新函数声明为参数 函数调用或分配 另一个对象的属性 供进一步阅读 匿名函数可以帮助生成代码 在声明函数时更简洁 这将只在一个地方使用。 而不是必须申报 函数,然后您可以使用它 一步到位。特别是 对于声明事件之类的事情很有用 处理程序

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


这是一个匿名函数,在创建后立即激发。

这是一个匿名函数

匿名函数是 在运行时动态声明 不必给它起名字

匿名函数是使用 函数运算符。你可以使用 函数运算符创建一个新的 函数,只要可以将 表情。例如,你可以 将新函数声明为参数 函数调用或分配 另一个对象的属性

供进一步阅读

匿名函数可以帮助生成代码 在声明函数时更简洁 这将只在一个地方使用。 而不是必须申报 函数,然后您可以使用它 一步到位。特别是 对于声明事件之类的事情很有用 处理程序和将方法分配给 对象

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

function Pet(name, species, hello)
{    
          this.name = name;    
          this.species = species;    
          this.hello = hello;

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

          this.sayHello = sayHello;    
      }
但一步完成这一切更方便、更简洁:

 function Pet2(name, species, hello)
 {
      this.name = name;    
      this.species = species;    
      this.hello = hello;

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

这在功能上相当于执行以下操作:

var myFunc = function(){
    var b = 3;
    a += b;
};

myFunc();

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

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

var b = 3;
a += b;

b将是全局变量。所以,如果您需要全局代码中的私有变量,这就是实现这一点的方法

这是一个就地执行的匿名函数。它的最佳用途是设置一些上下文或环境设置,或者在加载时产生一些副作用


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

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

它位于括号内以防止语法错误。如果没有括号,则关键字
函数
后面需要跟一个标识符

您也可以这样做,将函数放入变量中,然后调用它:

var x = function() {
   var b = 3;
   a += b;
}
x();

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

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

var a = function() {alert("done");};
a();
这通常用于各种函数中,在这些函数中必须传递一些逻辑。例如,数组的“sort”函数要求在内部传递函数对象,以确定如何对数组进行排序:

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
});
var a=[{id:15,name:'test'},
{id:11,名称:'asd'},
{id:88,名称:'qweqwe'}];
a、 排序(功能(a、b){
如果(a.id>b.id)返回1;//将a放在b之后
if(a.id
然后,“sort”方法使用各种数组元素调用提供的函数对其进行排序


您的示例所做的-它创建一个函数对象并立即运行它。

Justin的回答很好地解释了这一点,但我想我要补充的是,就程序执行而言,第一组括号(函数
之前的开头括号)实际上是完全不必要的。然而,对于可读性来说,这是非常重要的!当我看到这个:

(function() {
知道正在立即调用此函数,而无需向下滚动以查找块的结尾。这一点很重要,因为有时需要将函数的返回值指定给变量,有时需要将函数指定给变量。见:

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

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

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

非常感谢。现在我不确定该接受哪个答案,因为所有答案都很好。贾斯汀提供了一个例子……在我的书中,它赢了:)不要忘记在paranthesis中加入匿名函数的原因,尽管……可能太晚了,因为它现在已经被很好地涵盖了……这不仅仅是另一种方式。您的方式将创建一个变量
myFunc
,该变量可能会与其他现有变量冲突,也可能不会冲突。OP发布的代码不创建此变量。当然还是匿名的。但是这个值被绑定到一个变量,在OPs代码中不存在。我并不是说这两个值完全相等……只是功能上。他们最终将产生同样的结果。
var x = (function() {
    return 4;
})();

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

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