在JavaScript中,函数声明后面的空括号()代表什么意思?

66
我正在尝试阅读原型源代码。我来到了这个部分。(不幸的是,这段代码在开头)。
这个()是什么意思?
  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)
    }
  })(),

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


1
注意:根据jslint的建议,您应该将最终执行的括号移动到函数括号内部:(function() {...}()) - ErikE
@ErikE 他们最终做的事情是一样的。请参考这个问题:https://dev59.com/ZWw15IYBdhLWcg3wYawx - Andrew Larsson
没有争议它们做同样的事情。这是一个风格上的考虑,因为如果不将执行括号放在外部括号内,可能会不清楚返回的是函数的结果而不是函数本身 - ErikE
4个回答

48
代码定义了一个匿名函数((function (){ ... })部分),然后调用它(没有参数)。接着将该值赋给对象的Browser属性,该对象很可能是在您的代码片段之外定义的。
您还可以在其他地方定义该函数:
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,
...

用这种方式的一个缺点是,你会“污染你的命名空间”并且引入了一个函数和变量,而你不会在其他地方使用它们。第二个问题是,在函数定义中无法使用任何局部作用域变量的值(匿名函数行为类似于闭包)。


41

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

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

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


3
哪一种是正确的符号表示法?(function(){}()); 还是 (function(){})(); -- 我在谈论最后的括号顺序。 - ayjay
3
你的第一份回答是正确的,@ayjay。 - Jonesopolis
3
@ayjay 实际上两种都是正确的,但 Crockford 使用前者,所以我会选择前者。http://javascript.crockford.com/code.html - GFoley83
@ajay 我认为最好的符号表示法应该是 !function(){}(),因为它稍微更短一些。然而,如果你正在使用闭包编译器压缩工具(正如你应该这样做),那么你选择哪个都无所谓,因为闭包编译器会自动将你的代码转换为这个更短的版本。 - Jack G

13

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


5

这是一个简单的函数调用,与 foo() 没有区别,只不过它调用了一个匿名函数字面量,函数的结果被赋值给了 Browser 属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接