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


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

09-11 19:52
查看更多