【问题标题】:How is IIFE better than "named function declaration" in preventing name collision?IIFE 在防止名称冲突方面如何优于“命名函数声明”?
【发布时间】: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


【解决方案1】:

你的两个例子没有可比性。

创建一个包含具有公共方法的对象的全局。其他伟大的全局函数是一个函数,它将返回一个带有公共方法的对象。

实际的等价物是:

var GenericModuleName = ObjectWhichHasPublicMethod;

……但好处并非来自避免与GenericModuleName 发生名称冲突。它们来自避免与所有其他变量发生名称冲突。

var GenericModuleName = function() {

    var i = 0;

    function privateMethod() {
        return i++;
    }

    return {
        PublicMethod : function PublicMethod() { privateMethod(); }
    }
}();

iprivateMethod 都不是全局变量,因此它们不能与其他全局变量发生冲突。

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2018-03-30
    • 2019-02-15
    相关资源
    最近更新 更多