函数声明后在javascript中做空括号()是什么?

What do empty parentheses () after a function declaration do in javascript?

本问题已经有最佳答案,请猛点这里访问。


我正在尝试阅读Prototype源代码。 我来到这一部分。(不幸的是,这个片段在开头)。


这是什么意思?

1
2
3
4
5
6
7
8
9
10
11
  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)
    }
  })(),


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



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


您还可以在某处定义函数:

1
2
3
4
5
6
7
8
9
10
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)
}


然后调用它:

1
var foo = myFunction();


然后分配值:

1
2
3
...
Browser: foo,
...


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



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


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


对于此特定函数,匿名函数会向Browser对象返回多个属性。因此,您最终会得到布尔值,例如Browser.IEBrowser.Opera等。



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



这是一个简单的函数调用,除了调用匿名函数文字外,与foo()没有区别,函数的结果被赋给Browser属性。