javascript - IIFE 在防止名称冲突方面比 "named function declaration"有何优势?

标签 javascript design-patterns module iife

我有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(); }
    }
}();

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

关于javascript - IIFE 在防止名称冲突方面比 "named function declaration"有何优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38694136/

相关文章:

javascript - 如何将 jQuery 代码放入 WordPress 主题的外部文件中?

javascript - 根据所选选项更改显示

wcf - Web 服务协调

c++ - 这个在设计模式中的名称是什么?

Python:日志记录模块 - 全局

module - 在 OCaml 中哪里放置共享实用程序模块?

javascript - 有没有类似 Ruby 的 JavaScript 模块

javascript - 使用 js.color 的自定义选择不起作用

javascript - 具有 Open Layer 3 的 EC2 开放街道 map 服务器

c# - 如何通过组合包含属性?