这是什么类型的JavaScript模式?

3
    var AppName = (function (parent, $) {
      var controller = parent.controller = parent.controller || {};

      controller.index_page = function (parent) {
        var createPage = parent.createPage = parent.createPage || {};

        createPage.init = function () {
          alert('javascript initialized');
        };
        return createPage;
      }(controller);

      return parent;
    }(AppName || {}, jQuery));  

这是哪种JavaScript模式?我在哪里可以找到更多信息?

@Bergi 在你将此问题标记为重复之前,请检查提问日期。 - Saanch
日期对于一个问题是否属于同一主题以及答案质量有何影响? - Bergi
4个回答

8

这被称为模块模式(至少是我所知道的名称)。

http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html

这种模式的一些好处包括:

  • 封装,使您能够在闭包中定义私有字段。

  • 您可以通过指定第三个参数为undefined并将其传递为空来确保未定义的值始终正确(这是因为在javascript中undefined实际上可以被覆盖)。

  • Javascript命名空间,以更清晰地分离关注点。

使用undefined方法的示例:

var AppName = (function (parent, $, undefined) { //add parameter for undefined here
  var controller = parent.controller = parent.controller || {};

  controller.index_page = function (parent) {
    var createPage = parent.createPage = parent.createPage || {};

    createPage.init = function () {
      alert('javascript initialized');
    };
    return createPage;
  }(controller);

  return parent;
}(AppName || {}, jQuery)); //do not define anything for the undefined parameter here.

函数末尾的括号目的在于立即调用函数并形成闭包,使您可以访问公共变量/函数同时隐藏私有变量/函数。这被称为立即调用函数表达式(IIFE),有时也称为 iffy。

1
看起来是正确的链接。+1 - Saanch
您还可以添加诸如自调用(立即调用)函数、使用 || 进行默认值设置等术语。 - Ruan Mendes
@Saanch 当正确实现时,这种模式非常有用,并且是任何认真的JavaScript开发人员应该研究和在适当的情况下使用的模式。 - BenM
@BenM 它比透露模块模式更好吗? - Saanch
@Saanch 可能有一些情况会更好,但总体而言我会说不。模块模式允许使用诸如覆盖公共函数之类的技术。 - BenM

3
这种模式被称为“模块模式”(module pattern)

具体来说,这是一个立即调用的函数。

var Module = (function(parameters) {

})(parameters)

我建议阅读Addy Osmani的整本书,而不仅仅是我上面链接的部分。


1

-1

请提供待翻译的内容。 - Saanch
不,它并不是......但它回答了你的一个问题。 - Dave Haigh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接