JavaScript示例模块模式

我找不到任何可访问的例子,显示两个(或更多)不同的模块如何连接在一起工作。

所以,我想问问是否有人有时间写一个例子说明模块如何协同工作。

为了接近模块化devise模式,您需要首先理解这些概念:

立即调用函数expression式(IIFE):

(function() { // Your code goes here }()); 

有两种方法可以使用这些function。 1.函数声明2.函数定义 这里使用的是函数定义expression式。

什么是命名空间? 现在,如果我们将命名空间添加到上面的代码片段

 var anoyn = (function() { }()); 

什么是JS的封闭?

这意味着如果我们声明任何具有任何variables作用域的函数/在另一个函数内(在JS中,我们可以在另一个函数内声明一个函数!),那么它将始终计算该函数作用域。 这意味着外部函数中的任何variables都将被读取。 它不会读取具有相同名称的全局variables(如果有的话)。 这也是使用模块化devise模式避免命名冲突的目标之一。

 var scope = "I am global"; function whatismyscope() { var scope = "I am just a local"; function func() {return scope;} return func; } whatismyscope()() 

现在我们将应用上述三个概念来定义我们的第一个模块化devise模式:

 var modularpattern = (function() { // your module code goes here var sum = 0 ; return { add:function() { sum = sum + 1; return sum; }, reset:function() { return sum = 0; } } }()); alert(modularpattern.add()); // alerts: 1 alert(modularpattern.add()); // alerts: 2 alert(modularpattern.reset()); // alerts: 0 

上面的代码jsfiddle。

目标是隐藏来自外部世界的variables可访问性。

希望这可以帮助。 祝你好运。

我真的build议任何人进入这个课题阅读Addy Osmani的免费书籍:

“学习JavaScriptdevise模式”。

http://addyosmani.com/resources/essentialjsdesignpatterns/book/

当我开始编写更易维护的JavaScript时,这本书帮了我很大的忙,我仍然把它作为参考。 看看他不同的模块模式实现,他解释得很好。

我想通过谈论如何将模块组合到应用程序中来扩展上述答案。 我在doug crockford的书中读到过这个,但是对于javascript来说是新的,但是它仍然有点神秘。

我来自交stream背景,所以添加了一些我觉得有用的术语。

HTML

你会有一些顶级的HTML文件。 这有助于将其视为您的项目文件。 您添加到项目中的每个JavaScript文件都希望进入此操作,不幸的是,您不会获得对此的工具支持(我正在使用IDEA)。

您需要使用如下脚本标签将文件添加到项目中:

  <script type="text/javascript" src="app/native/MasterFile.js" /></script> <script type="text/javascript" src="app/native/SomeComponent.js" /></script> 

看起来崩溃的标签导致事情失败 – 而它看起来像XML这真的是疯狂的规则!

命名空间文件

MasterFile.js

 myAppNamespace = {}; 

而已。 这只是为我们的代码的其余部分添加一个全局variables。您也可以在这里(或在它们自己的文件中)声明嵌套的命名空间。

模块(一个或多个)

SomeComponent.js

 myAppNamespace.messageCounter= (function(){ var privateState = 0; var incrementCount = function () { privateState += 1; }; return function (message) { incrementCount(); //TODO something with the message! } })(); 

我们在这里做的是给我们的应用程序中的variables分配一个消息计数器函数。 这是一个函数,它返回一个我们立即执行的函数。

概念

我认为这有助于将SomeComponent中的最上面一行看作是声明某些东西的命名空间。 唯一需要注意的是,所有的命名空间都需要首先出现在其他文件中 – 它们只是我们应用程序variables的根源。

我现在只采取了小步骤(我重构了一些正常的JavaScript的extjs应用程序,所以我可以testing它),但它似乎相当不错,因为你可以定义一些function单位,同时避免“这个泥泞'

您也可以使用此样式来定义构造函数,方法是返回一个返回具有函数集合的对象的函数,而不是立即调用它。

这里https://toddmotto.com/mastering-the-module-pattern你可以find彻底解释的模式。; 我会补充说,关于模块化JavaScript的第二件事是如何在多个文件中构build代码。 许多人可能会build议你在这里与AMD合作,但是我可以从经验中得知,由于大量的HTTP请求,你将会在某些时候遇到页面响应慢的问题。 出路在于按照CommonJS标准将JavaScript模块(每个文件一个)预编译为一个文件。 看看这里的样品http://dsheiko.github.io/cjsc/

你可以在这里find模块模式JavaScript http://www.sga.su/module-pattern-javascript/