【发布时间】:2016-08-01 08:25:57
【问题描述】:
我有read on stackoverflow 说,IIFE 模式在实现模块而不是仅仅“命名函数声明”中的好处是,在大型项目中,它可以防止名称冲突。然而,在我看来,IIFE 在防止名称冲突方面并不比命名函数声明更好或更差。
考虑编写一个库的两种方法,该库公开一个名为“GenericModuleName”的名称:
IIFE 方法
var GenericModuleName = (function () {
return ObjectWhichHasPublicMethod;
})();
命名函数声明方法
function GenericModuleName() {
return {
PublicMethod : function () { privateMethod(); }
}
};
在这两种情况下,如果库的用户碰巧也有一个名为 GenericModuleName 的函数,那么仍然会出现名称冲突,不是吗?那么 IIFE 在防止名称冲突方面比“命名函数声明”更好吗?
【问题讨论】:
-
您链接到的问题没有给 IIFE 命名,它使用匿名函数。没有名称冲突,因为没有名称。
-
如果两个库对模块本身具有相同的名称,则无法防止冲突。这个想法是为了防止不同模块中的函数之间发生冲突。
-
@Barmar 在现实生活中,IIFE 不会被命名以使其可调用吗?
-
没有。将
()放在定义后立即调用它。这就是为什么它被称为“立即调用函数表达式”。 -
我不明白“防止不同模块中的函数之间的冲突”。我认为不同模块中的函数之间的冲突是不可能的,因为 ModuleA 的 foo 永远不会与 ModuleB 的 foo 冲突,因为 foo 必须由 ModuleA 或 ModuleB 实例限定,如 a.foo 或 b.foo?
标签: javascript design-patterns module iife