javascript 中函数声明后的空括号 () 有什么作用?

IT技术 javascript
2021-02-14 06:58:31

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

这是什么意思?

  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)
    }
  })(),

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

4个回答

代码定义了一个匿名函数((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,
...

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

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

添加()到最后调用刚刚创建的函数。

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

哪一个是正确的符号?(function(){}());或者(function(){})(); ——我说的是最后的括号顺序。
2021-04-29 06:58:31
@ayjay 实际上,任何一个都是对的,但 Crockford 使用的是前者,所以我会同意。http://javascript.crockford.com/code.html
2021-05-08 06:58:31
@ajay 我会说最好的符号是!function(){}()因为它略短。但是,如果您正在使用闭包编译器缩小器(正如您应该使用的那样),那么您选择哪个都无关紧要,因为闭包编译器会自动将您的代码转换为这个较短的版本。
2021-05-10 06:58:31
你的第一个是对的@ayjay
2021-05-15 06:58:31

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

这是一个简单的函数调用,foo()除了调用匿名函数文字之外没有什么不同,函数的结果被分配给Browser属性。