带冒号的Javascript返回
我正在学习JavaScript,遇到了以下结构:带冒号的Javascript返回,javascript,return,revealing-module-pattern,Javascript,Return,Revealing Module Pattern,我正在学习JavaScript,遇到了以下结构: var Test = (function () { function func1() { //do something..... } function func2() { //do something..... } function func3() { //do something..... } return { func1: func1, func2
var Test = (function () {
function func1() {
//do something.....
}
function func2() {
//do something.....
}
function func3() {
//do something.....
}
return {
func1: func1,
func2: func2,
func3: func3
};
})();
我想知道返回块在做什么。这是一种非常常用的JavaScript结构吗?请告诉我在哪里可以获得更多信息。这是显示模块模式的 返回的对象包含对IIFE中定义的函数的引用。因此,内部定义的函数是匿名函数的私有函数 但是如果您想在外部使用内部函数,可以使用返回的对象
Test
的值将为
var Test = {
func1: func1,
func2: func2,
func3: func3
};
您还可以从外部调用func1
Test.func1();
这是Javascript模拟类的方式。由于没有使用模块模式的可见性说明符,所以可以将变量/方法设置为公共/私有
揭示模块模式的灵感来自模块模式。在显示模块模式中,对象中只返回对私有变量/方法的引用
该模式背后的主要思想是避免有害的全局变量。除了返回一个对象而不是函数之外,它看起来类似于IIFE。IIFE中定义的变量/方法对于函数是私有的。要访问IIFE内部的任何变量/方法,需要将其添加到返回的对象中,然后才能从IIFE外部访问它。此模式利用闭包,因此即使在返回对象之后,IIFE中定义的变量/方法也可以访问
来自艾迪·奥斯马尼的书
当我们想从另一个公共方法调用一个公共方法或访问公共变量时,Heilmann不得不重复主要对象的名称,这一事实让Heilmann感到沮丧,于是出现了显示模块模式。他还不喜欢模块模式的要求,即对于他希望公开的内容,必须切换到对象文字符号
他的努力的结果是一个更新的模式,我们只需在私有范围内定义所有函数和变量,并返回一个匿名对象,其中包含指向我们希望公开的私有功能的指针
优势:
值得注意的是,创建一个对象(例如,
var me={};
)然后在其上声明可能的公共成员(me.func1=function(){/*…*/};
),并在末尾返回该对象(返回我;
)。这避免了我们在OP代码的return语句中看到的重复(所有公共内容都是重复的)
它的工作原理类似于其他编程语言中的类。因此,您可以使用
Test.func1
访问公共func1
成员,并使用Test.func1()
像调用普通函数一样调用它。它是return语句中的文本对象。这就像创建一个对象然后返回:
var obj = {
func1: func1,
func2: func2,
func3: func3
};
return obj;
文字对象语法创建对象并设置其属性,如下所示:
var obj = new Object();
obj.func1 = func1;
obj.func2 = func2;
obj.func3 = func3;
return obj;
返回对象的目的是向外部代码显示函数内部的函数,同时为函数可以使用的私有变量创建一个作用域
当不使用私有变量时,代码执行与以下相同的操作:
var Test = {
func1: function() {
//do something.....
},
func2: function() {
//do something.....
},
func3: function() {
//do something.....
}
};
私有变量在函数范围内声明,并且只能由函数范围内的函数访问。例如:
var Test = (function () {
var name;
function setName(str) {
name = str;
}
function getName() {
return name;
}
return {
setName: setName,
getName: getName
};
})();
Test.setName("John Doe");
var name = Test.getName();
不需要时,为什么要使用
newobject()
或字符串表示法?@Seiyria:与不使用文本对象表示法的文本对象表示法相同。我只是将字符串表示法更改为常规属性标识符。:)我想我的观点是var object={}
比var object=new object()
好得多。它更有意义。@Seiyria:是的,但这是一个对象文字,我想展示对象文字的作用。值得注意的是,创建一个对象(例如,var me={};
)然后声明其上的潜在公共成员(me.func1=function(){/*…*/};
)是很常见的,并在末尾返回该对象(return me;
)。这避免了我们在OP的代码返回声明中看到的重复(所有公共内容都重复了)。感谢反馈,下层选民。一定要“热爱2016 SE社区”。