什么是JavaScript函数声明后做空括号()?
我正在尝试阅读原型来源。 我来到这个部分(不幸的是,这个片段正在开始)。
这是什么意思?
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
属性。
你也可以在某处定义函数:
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, ...
这样做的一个缺点是你用一个函数和一个你不会在其他地方使用的variables“污染你的名字空间”。 第二个问题是,你不能在你的函数定义中使用任何局部范围的variables的值(匿名函数的行为像一个闭包)。
(function () {})
创build一个匿名函数。
将()
添加到最后调用刚刚创build的函数。
在这个特定函数的情况下,匿名函数返回Browser
对象的几个属性。 所以,你最终会得到布尔值,比如Browser.IE
, Browser.Opera
等等。
它调用刚刚声明的匿名函数,有效地导致“块”被评估。
这是一个简单的函数调用,除了调用一个匿名函数字面值之外,与foo()
没有区别,函数的结果被分配给Browser
属性。