我有read on stackoverflow的观点,IIFE模式在实现模块而不是仅在“命名函数声明”中的好处是,在大型项目中,它可以防止名称冲突。但是,在我看来,IIFE并不比用于防止名称冲突的命名函数声明更好或更糟。
考虑两种编写库的方法,该库公开了一个名为“ GenericModuleName”的名称:
IIFE方法
var GenericModuleName = (function () {
return ObjectWhichHasPublicMethod;
})();
命名函数声明方法
function GenericModuleName() {
return {
PublicMethod : function () { privateMethod(); }
}
};
在这两种情况下,如果库的用户碰巧也有一个名为GenericModuleName的函数,那么仍然会有名称冲突,不是吗?那么在防止名称冲突方面,IIFE如何比“命名函数声明”更好?
最佳答案
您的两个示例并非真正可比。
一个创建带有全局对象的全局对象。另一个具有一个全局函数,该函数将使用公共方法返回一个对象。
实际等效为:
var GenericModuleName = ObjectWhichHasPublicMethod;
…但是好处不是避免与
GenericModuleName
发生名称冲突。它们来自避免与其他所有变量发生名称冲突。var GenericModuleName = function() {
var i = 0;
function privateMethod() {
return i++;
}
return {
PublicMethod : function PublicMethod() { privateMethod(); }
}
}();
i
和privateMethod
都不是全局变量,因此它们不能与其他全局变量冲突。