我有read on stackoverflow IIFE 模式在实现模块而不仅仅是“命名函数声明”方面的好处在于,在大型项目中,它可以防止名称冲突。然而,在我看来,IIFE 并不比用于防止名称冲突的命名函数声明更好或更差。
考虑编写公开名为“GenericModuleName”的名称的库的两种方法:
IIFE 方法
var GenericModuleName = (function () {
return ObjectWhichHasPublicMethod;
})();
命名函数声明方法
function GenericModuleName() {
return {
PublicMethod : function () { privateMethod(); }
}
};
在这两种情况下,如果库的用户碰巧也有一个名为 GenericModuleName 的函数,那么仍然会出现名称冲突,不是吗?那么 IIFE 在防止名称冲突方面比“命名函数声明”更好吗?
最佳答案
你的两个例子实际上没有可比性。
创建一个包含具有公共(public)方法的对象的全局变量。另一个是全局函数,它将返回带有公共(public)方法的对象。
实际的等价物是:
var GenericModuleName = ObjectWhichHasPublicMethod;
…但好处并不是来自避免与 GenericModuleName
的名称冲突。它们来自于避免与所有其他变量发生名称冲突。
var GenericModuleName = function() {
var i = 0;
function privateMethod() {
return i++;
}
return {
PublicMethod : function PublicMethod() { privateMethod(); }
}
}();
i
和 privateMethod
都不是全局变量,因此它们不会与其他全局变量发生冲突。
关于javascript - IIFE 在防止名称冲突方面比 "named function declaration"有何优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38694136/