我正在尝试阅读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)
}
})(),
我指的是逗号前的最后一行?
答案 0 :(得分:41)
代码定义了一个匿名函数((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,
...
这样做的一个缺点是你用一个你不会在其他任何地方使用的函数和变量来“污染你的命名空间”。第二个问题是您不能在函数定义中使用任何本地范围的变量的值(匿名函数表现为闭包)。
答案 1 :(得分:30)
(function () {})
创建一个匿名函数。
将()
添加到结尾会调用刚刚创建的函数。
对于此特定函数,匿名函数会向Browser
对象返回多个属性。因此,您最终会得到布尔值,例如Browser.IE
,Browser.Opera
等。
答案 2 :(得分:12)
它调用刚刚声明的匿名函数,有效地导致“块”被评估。
答案 3 :(得分:5)
这是一个简单的函数调用,与foo()
没有什么不同,除非它调用匿名函数文字,函数的结果被赋值给Browser
属性。