Javascript 这两种不同的模块模式语法之间的功能区别是什么
我到处都能看到这种语法:Javascript 这两种不同的模块模式语法之间的功能区别是什么,javascript,design-patterns,iife,Javascript,Design Patterns,Iife,我到处都能看到这种语法: var mod = (function(){ var pvtvar; var pvtfunc = function(){}; //return an object literal return { pubvar : 'whatever', pubfunc : function(){} }; }()); 我最近遇到了以下语法: //first create empty object var mod = {}; (function(m
var mod = (function(){
var pvtvar;
var pvtfunc = function(){};
//return an object literal
return {
pubvar : 'whatever',
pubfunc : function(){}
};
}());
我最近遇到了以下语法:
//first create empty object
var mod = {};
(function(mod){
var pvtvar;
var pvtfunc = function(){};
//modify the mod object argument
mod.pubvar = 'whatever';
mod.pubfunc = function(){};
}(mod)); //pass object to IIFE
我知道它们都能工作,我想我完全理解为什么,我只是想确保我没有遗漏任何东西…给定相同的成员,你最终得到的是相同的对象,只是在第二个示例中,mod
在几分之一秒的时间内引用了全局范围内的空对象,而在第一个示例中,mod
仅在IIFE返回完整对象的值后才引用该对象
那么,我是否正确地认为,唯一的区别是第二个对象作为空对象存在的时间量(非常小)?
我的后续问题是:你使用第二种语法吗?为什么?你是对的。在您的示例中,第一个语法更清晰,可读性更强
当您希望将空对象以外的内容传递到模块中并得到一个扩展对象作为回报时,可以使用第二种语法。我明白了,这似乎很明显……既然您已经编写了它。因此,您可以使用第二种语法来构建从另一个继承的模块。但奇怪的是,到目前为止,我只见过它与空对象一起使用。