【问题标题】:Strange JavaScript syntax like this: (function(){//code}) ();?像这样奇怪的 JavaScript 语法:(function(){//code}) ();?
【发布时间】:2009-08-27 12:47:57
【问题描述】:

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

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

【问题讨论】:

  • 谢谢。现在我不确定要接受哪个答案,因为一切都很好。
  • 贾斯汀提供了一个例子......在我的书中,它赢了:)

标签: javascript function


【解决方案1】:

它的功能等同于执行以下操作:

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

myFunc();

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

【讨论】:

  • 这不仅仅是另一种方式。您的方式将创建一个变量myFunc,它可能会或可能不会与其他现有变量发生冲突。 OP 发布的代码不会创建此变量。当然,它仍然是匿名的。但是该值被绑定到一个变量,不存在于 OPs 代码中。
  • 我并不是说这两者完全一样……只是功能上。它们最终会产生相同的结果。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    它是一个匿名函数。

    匿名函数是 在运行时动态声明 不必命名。

    匿名函数使用声明 函数运算符。您可以使用 函数运算符创建一个新的 在任何有效的地方放置一个函数 表达。例如你可以 声明一个新函数作为参数 到函数调用或分配一个 另一个对象的属性。

    进一步阅读

    Javascript anonymous functions

    匿名函数可以帮助编写代码 声明函数时更简洁 只会在一个地方使用。 而不是必须声明 功能然后使用它你可以做到 一步到位。特别是 用于声明事件之类的东西 处理程序和分配方法 对象。

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

    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);    
          }    
      }
    

    【讨论】:

    • 不要忘记将匿名函数放在括号内的原因……可能为时已晚,因为现在已经很好地涵盖了……
    【解决方案4】:

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

    var b = 3;
    a += b;
    

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

    【讨论】:

      【解决方案5】:

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

      括号内是为了防止语法错误。没有括号的关键字function 需要后跟一个标识符。

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

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

      请注意,如果function 关键字不是第一个,则不需要括号。

      【讨论】:

        【解决方案6】:

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

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

        这通常用于必须在内部传递一些逻辑的各种函数中。例如,数组的“排序”函数需要传入一个函数对象以确定如何对数组进行排序:

        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' 方法然后调用提供的具有各种数组元素的函数对其进行排序。

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

            (function() {
            

            知道会立即调用此函数,无需向下滚动即可找到块的末尾。这很重要,因为有时您希望将函数的返回值分配给变量,而有时您希望将 函数 分配给变量。见:

            var x = (function() {
                return 4;
            })();
            
            var y = function() {
                return 4;
            };
            
            // typeof x == integer (4)
            // typeof y == function
            

            【讨论】:

              猜你喜欢
              • 2013-09-05
              • 2021-10-28
              • 2011-10-25
              • 1970-01-01
              • 1970-01-01
              • 2019-02-08
              相关资源
              最近更新 更多