2016-08-11 48 views
2

考虑下面的代码,基于“松散增强”模块模式在http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html分配到出口与模块之间有什么区别?

var FOO = (function(exports) { 

    //What is the difference between this: 
    exports.hello = "hello"; 
    return exports; 

}(FOO || {})); 

var FOO = (function(exports) { 

    //And this: 
    FOO.world = "world"; 
    return exports; 

}(FOO || {})); 

//When the result works either way: 
alert(FOO.hello + " " + FOO.world); 

在这个例子中所描述的,为什么会一个分配给exportsFOO时,它的工作原理相同的两种方式?有什么不同?

+0

没有。使用“出口”这样的东西的好处是你可以自动告诉读者你要输出的东西。你可以发现'FOO.world'和'exports.world'是一样的,或者你可以明确地写出'exports.world'。然后你的所有代码都遵循同样的模式。它给读者一点思考的东西。 –

回答

2

这两个版本并不相同。当您尝试分配FOO.world时,第二个出错,因为此时FOO仍未定义。现在你的代码只能工作,因为第一个模块定义正在创建FOO对象。

至于为什么exports变量的主要原因是它将模块定义从模块名称中分离出来。您只需编写一次模块名称(FOO),并且如果您位于服务器端环境中,则可能甚至不需要使用模块名称(其隐含文件名称)。

注意如何在链接你的游戏,即使是简单的“模块导出”版本已经使用了“我的”变量的模块,而不是分配给直接模块:

var MODULE = (function() { 
    var my = {}, 
     privateVariable = 1; 

    function privateMethod() { 
     // ... 
    } 

    my.moduleProperty = 1; 
    my.moduleMethod = function() { 
     // ... 
    }; 

    return my; 
}()); 
相关问题