在 JS 模块模式中使用常规函数而不是函数表达式有什么影响吗?



对于js模块模式,我认为函数通常定义如下:

var loadData = function(myParam1, myParam2){}

但是,js 模块模式仍然适用于如下定义的函数:

function loadData (myParam1, myParam2){}

在 js 模块中将函数定义为变量有什么实际的理由吗? 从设计标准的角度来看,对于 js 模块中公开的方法,函数变量通常是否是必需的? 还是实现风格真的更多是个人喜好的问题?

模块模式通常由 IIFE 模式增强:

(function(){
})();

下面是一个示例:

var MODULE = (function(){
function anotherLoadData(myParam1, myParam2){
console.log('another load data')
}
return {
loadData : function(myParam1, myParam2){ 
console.log('load data');
},
anotherLoadData : anotherLoadData
}
})();
MODULE.loadData();
MODULE.anotherLoadData();

所以你看,你声明函数的方式与js模块模式无关。

这个编辑过的答案会更好吗: [学习JavaScript设计模式][1]

模块模式

模块模式最初被定义为为传统软件工程中的类提供私有和公共封装的一种方式。

在 JavaScript 中,Module 模式用于进一步模拟类的概念,以便我们能够在单个对象中包含公共/私有方法和变量,从而将特定部分与全局范围隔离开来。这导致我们的函数名称与页面上其他脚本中定义的其他函数冲突的可能性降低。

模块模式使用闭包封装"隐私"、状态和组织。它提供了一种包装公共和私有方法和变量混合的方法,防止部分泄漏到全局范围内并意外与其他开发人员的接口发生冲突。使用此模式时,仅返回一个公共 API,使闭包中的其他所有内容保持私有。

这为我们提供了一个干净的解决方案,用于屏蔽逻辑完成繁重的工作,同时只公开我们希望应用程序的其他部分使用的接口。该模式与立即调用的函数表达式非常相似(IIFE - 有关此内容的更多信息,请参阅命名空间模式部分),只是返回的是对象而不是函数。

应该注意的是,JavaScript 内部并没有真正意义上的"隐私",因为与某些传统语言不同,它没有访问修饰符。从技术上讲,变量不能声明为公共或私有,因此我们使用函数作用域来模拟这个概念。在模块模式中,由于闭包,声明的变量或方法仅在模块本身内部可用。但是,在返回对象中定义的变量或方法对每个人都可用。

历史

从历史的角度来看,模块模式最初是由包括Richard Cornford在内的许多人在2003年开发的。后来道格拉斯·克罗克福德(Douglas Crockford)在他的讲座中推广了它。另一个琐事是,如果你曾经玩过雅虎的YUI库,它的一些功能可能看起来很熟悉,原因是模块模式在创建组件时对YUI有很大的影响。

例子

让我们通过创建一个自包含的模块来开始查看模块模式的实现。

var testModule = (function () {
var counter = 0;
return {
incrementCounter: function () {
return counter++;
},
resetCounter: function () {
console.log( "counter value prior to reset: " + counter );
counter = 0;
}
};
})();

//用法:

增加我们的计数器

testModule.incrementCounter();

最新更新