带冒号的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

我正在学习JavaScript,遇到了以下结构:

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感到沮丧,于是出现了显示模块模式。他还不喜欢模块模式的要求,即对于他希望公开的内容,必须切换到对象文字符号

他的努力的结果是一个更新的模式,我们只需在私有范围内定义所有函数和变量,并返回一个匿名对象,其中包含指向我们希望公开的私有功能的指针

优势:

  • 封装。IIFE内部的代码是从外部世界封装的
  • 干净、有组织和可重用的代码
  • 隐私。它允许创建私有变量/方法。私有变量/方法不能从IIFE外部接触
  • 缺点:

  • 如果私有函数引用公共函数,则不能重写该公共函数
  • 进一步阅读:

  • 编辑


    值得注意的是,创建一个对象(例如,
    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社区”。