我在提出的示例中发现了自己的错误,因此更改了问题的最后一部分。抱歉。
在学习JavaScript模块模式的示例中,我看到了以下代码:
var singletone1 = function() {
function sayHello() {
console.log("Hello")
}
return {
sayHello: sayHello
}
}()
此代码可以很好地用作揭示模块模式的示例。但是我意识到这与IIFE版本具有相同的结果:
var singletone2 = (function() {
function sayHello() {
console.log("Hello")
}
return {
sayHello: sayHello
}
})()
我感到奇怪的原因是,只要我知道,直接运行函数声明就会出错。
// Immediately Invoked Function Declaration
function(){
console.log('test');
}()
// => Uncaught SyntaxError: Unexpected token )
要运行此程序,我必须在括号中加上它。这样,它就变成了IIFE。但是对我来说奇怪的是 singletone1 示例仍然可以正常工作。
所以我的问题是在函数声明之间是否加上括号是否有区别?换句话说,不带括号的显示模块模式( singletone1 )和IIFE版本( singletone2 )之间有什么区别吗?
如果它们相同,那么这是运算符优先级的问题-括号是可选的吗?
答案 0 :(得分:0)
此问题的不错答案:
因此,我得出结论, singletone1 可以正常工作而没有任何问题,并且看起来与 singletone2 等效的原因是,在 equal右边的语句运算符被解释为函数表达式,而不是函数声明,尽管看起来像是声明。
我还了解到,语法上不允许单独使用匿名函数,因为唯一的匿名函数(不分配任何变量)将被解释为函数声明,但是函数声明必须具有名称标识符。这样,我得出结论,匿名函数只能在分配给任何变量后才能使用,或用作IIFE。
如果情况是匿名函数只能解释为函数表达式,则无需在其周围加上括号。在这种情况下,这可以是可选的。
答案 1 :(得分:-2)
评论解释。
var myLibrary = (function() {
// reference document only once for performance
var doc = document;
// object to expose as public properties and methods
var pub = {};
//myLibrary.color
pub.color = 'red';
//myLibrary.hello
pub.hello = function (name) {
alert('Hello ' + name);
};
//API
return pub;
}());