Javascript 在js模块模式中使用正则函数而不是函数表达式有什么含义吗?
对于js模块模式,我认为函数通常是这样定义的:Javascript 在js模块模式中使用正则函数而不是函数表达式有什么含义吗?,javascript,Javascript,对于js模块模式,我认为函数通常是这样定义的: var loadData = function(myParam1, myParam2){} function loadData (myParam1, myParam2){} 但是,js模块模式仍然适用于定义如下的函数: var loadData = function(myParam1, myParam2){} function loadData (myParam1, myParam2){} 在js模块中将函数定义为变量有什么实际原因吗?对于
var loadData = function(myParam1, myParam2){}
function loadData (myParam1, myParam2){}
但是,js模块模式仍然适用于定义如下的函数:
var loadData = function(myParam1, myParam2){}
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中,模块模式用于进一步模拟类的概念,这样我们就能够在单个对象中包含公共/私有方法和变量,从而屏蔽全局范围内的特定部分。这将降低函数名与页面上其他脚本中定义的其他函数冲突的可能性 模块模式使用闭包封装“隐私”、状态和组织。它提供了一种包装公共和私有方法和变量的混合方式,防止片段泄漏到全局范围,并避免与其他开发人员的接口发生意外冲突。使用此模式,只返回一个公共API,将闭包中的所有其他内容保持为私有 这为屏蔽逻辑提供了一个干净的解决方案,在屏蔽逻辑完成繁重工作的同时,只公开我们希望应用程序其他部分使用的接口。该模式非常类似于立即调用的函数表达式(IIFE-有关详细信息,请参阅命名空间模式部分),只是返回的是对象而不是函数 应该注意的是,JavaScript中并没有真正明确的“隐私”含义,因为与一些传统语言不同,它没有访问修饰符。从技术上讲,变量既不能声明为公共变量,也不能声明为私有变量,因此我们使用函数作用域来模拟这个概念。在模块模式中,由于闭包,所声明的变量或方法仅在模块内部可用。但是,在返回对象中定义的变量或方法对每个人都可用 历史 从历史的角度来看,模块模式最初是由包括Richard Cornford在内的许多人在2003年开发的。后来,道格拉斯·克罗克福德在他的演讲中推广了这一观点。另一件琐事是,如果你曾经玩过Yahoo的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();
我不知道我是否会将您在上面演示的调用为“模块模式”——它只是函数声明。也许有人可以纠正我,但我认为第一个(分配给变量的匿名函数)和第二个(命名函数)之间的唯一区别是,第二个将有一个关联的“
名称
”属性。第二种格式将首先求值,因此即使您在文件中最后定义了它,也可以在文件中更早地访问它。第一个示例作为正则变量声明,在声明之前是不可访问的。作为@anied所说的后续内容,可以将第一个示例命名为var loadData=function loadMyData(myParam1,myParam2){}
我知道我上面提供的第一个示例是函数表达式。我不明白的是,我是否应该始终使用函数表达式来表示将通过模块模式公开的函数,是否有我应该使用它们的特定场景,或者是否这真的只是个人偏好?anied真正的区别在于,对于函数声明,值初始化是随它一起提升的。(自ES6以来,.name
属性不再起作用,甚至作业表单也会创建一个属性)为什么这是一个答案而不是注释?取决于您如何看待它。我不是在给鱼,而是在教如何捕捉它!有人曾经告诉我保持链接仅供参考。链接可能会断开(以后几年)同意singsuyash的观点——链接可以作为补充材料,但它们本身并不是答案。@jmmontero——请参阅StackExchange Meta上的以下链接:我只是指js模块模式中定义的函数,而不是整个js模块实现“js模块模式”。这个术语很特殊。在另一篇文章中有更多的参考。如果你想问“js模块模式”以外的问题,我想你可能需要更改问题标题“您好,我指的是上面定义的函数,因为它们将在js模块模式中定义。js模块模式与某些属性和行为的名称空间相关。函数如何声明并不重要。我在回答中已经解释了这一点。除非您理解IIFE,并且正在讨论var MODULE=(function(){})()之间的差异代码>和(函数(模块){})(模块)代码>好,那么你是说在js模块中使用函数或函数表达式纯粹是个人喜好的问题,没有任何影响?