【问题标题】:What do empty parentheses () after a function declaration do in javascript? [duplicate]javascript中函数声明后的空括号()有什么作用? [复制]
【发布时间】:2011-01-26 04:39:00
【问题描述】:

我正在尝试阅读原型源。我来到了这部分。(不幸的是,这个sn-p是在开始)。

这个()是什么意思?

  Browser: (function(){
    var ua = navigator.userAgent;
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
    return {
      IE:             !!window.attachEvent && !isOpera,
      Opera:          isOpera,
      WebKit:         ua.indexOf('AppleWebKit/') > -1,
      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
      MobileSafari:   /Apple.*Mobile.*Safari/.test(ua)
    }
  })(),

我指的是逗号前的最后一行?

【问题讨论】:

  • 注意:根据jslint,你应该将最终执行的括号移到函数括号内:(function() {...}())
  • @ErikE 不过,他们最终会做同样的事情。看到这个问题:stackoverflow.com/questions/6645766/…
  • 没有争论他们做同样的事情。这是一种风格上的考虑,因为通过不将执行括号放在外部对中,可能不清楚返回的是函数的结果而不是函数本身.

标签: javascript


【解决方案1】:

代码定义了一个匿名函数((function (){ ... }) 位),然后调用它(不带参数)。然后,它将值分配给对象的 Browser 属性,该属性可能是在您的代码 sn-p 之外定义的。

你也可以在某处定义函数:

function myFunction() {
    var ua = navigator.userAgent;
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]';
    return {
      IE:             !!window.attachEvent && !isOpera,
      Opera:          isOpera,
      WebKit:         ua.indexOf('AppleWebKit/') > -1,
      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1,
      MobileSafari:   /Apple.*Mobile.*Safari/.test(ua)
}

然后调用它:

var foo = myFunction();

然后赋值:

...
Browser: foo,
...

这样做的一个缺点是,您会使用不会在其他任何地方使用的函数和变量“污染您的命名空间”。第二个问题是您不能在函数定义中使用任何局部范围变量的值(匿名函数表现为闭包)。

【讨论】:

    【解决方案2】:

    (function () {}) 创建一个匿名函数。

    在末尾添加() 调用刚刚创建的函数。

    在这个特定函数的情况下,匿名函数将几个属性返回给Browser 对象。因此,您最终会得到布尔值,例如 Browser.IEBrowser.Opera 等。

    【讨论】:

    • 哪个是正确的符号? (function(){}());(function(){})(); -- 我说的是最后的括号顺序。
    • 你的第一个是对的@ayjay
    • @ayjay 实际上任何一个都是正确的,但 Crockford 使用的是前者,所以我会去。 http://javascript.crockford.com/code.html
    • @ajay 我想说最好的符号是!function(){}(),因为它稍微短一些。但是,如果您使用的是闭包编译器压缩器(应该如此),那么您选择哪个都没有关系,因为闭包编译器会自动将您的代码转换为这个更短的版本。
    【解决方案3】:

    它调用刚刚声明的匿名函数,有效地导致“块”被评估。

    【讨论】:

      【解决方案4】:

      这是一个简单的函数调用,与 foo() 没有什么不同,只是它调用的是匿名函数字面量,函数的结果分配给 Browser 属性。

      【讨论】:

        猜你喜欢
        • 2022-07-06
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 2010-10-01
        • 2017-10-04
        相关资源
        最近更新 更多