- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JavaScript模块化开发一瞥
对于那些初学JavaScript、同时又正用它构建大型应用程序的开发者而言,必须面对的首要挑战是,该如何组织代码。尽管起初通过在 标记之间嵌入数百行代码就能跑起来,不过很快代码会变得一塌糊涂。其中的难点在于,对于组织我们的代码,JavaScript并未提供任何明显帮助。从字面上看,C#有using,Java有import——而JavaScript一无所有。这就迫使JavaScript作者去尝试各种不同约定(conventions),并用我们拥有的这种语言创建了一些实践方法来组织大型JavaScript应用程序。
形成现代JavaScript基础的那些模式、工具及实践必将来自语言本身以外的实现
——?Rebecca Murphy
模块模式(The Module Pattern)
解决此问题使用最为广泛的方法是模块模式(Module Pattern)。我尝试在下面解释一个基本示例,并谈论它的一些属性。对于各种不同方法更好的描述和梦幻般的运行,请参阅Ben Cherry的帖子——JavaScript Module Pattern: In-Depth(深入理解JavaScript模块模式)。
function lab49 function privateAdder n1, n2 return n1 + n2; lab49.add function n1, n2 return privateAdder n1, n2 ; // 原文代码有误,已修正。 ; window.lab49 window.lab49 || ;
上面的示例中,我们只使用一些来自语言本身的基本功能,就创建了曾在C#和Java等语言中见过的类似结构。
隔离(Isolation)
你会注意到这段代码包在一个立即调用的函数里(查看最后一行)。在浏览器中,默认情况下会在全局范围(global scope)级别上对JavaScript文件进行评估(evaluated),因此在我们在文件内声明的任何内容都是随处可用的。想象一下,如果在lib1.js中有句var name ...,而lib2.js中有另一句var name ...。那么第二个var语句会替掉第一句的值——这可不太妙。然而,由于JavaScript拥有函数作用域(function scoping)级别,上例中所声明的一切都在该函数自身作用域中,与全局作用域相脱离。这意味着,无论未来在系统中发生什么,位于该函数中的任何内容都会被隔离开来。
命名空间(Namespacing)
在最后一行中,你会发现我们要么把window.lab49赋给其自身,要么把空对象直接量(empty object literal)赋给它。尽管看起来有些奇怪,但是让我们一起看下某个虚构的系统,在那里我们拥有若干js文件,所有文件都用了上例中的函数包装器(function wrapper)。
首个包含进来的文件会评估OR(逻辑或)语句,并发现左侧表达式为undefined(未定义)。由于undefined是虚假值(falsely value),因此OR语句会继续评估右侧表达式,本例中是个空对象直接量。此OR语句实际上是个会返回评估结果的表达式,然后将结果赋给全局变量window.lab49。
现在,轮到下个文件来使用此模式了,它会获得OR语句,并发现window.lab49当前是对象实例 — — 真值(truthy value)。OR语句会短路并返回这个值,并将此值立即赋给其自身 — — 实际上啥也没做。
这导致的结果是,首个包含进来的文件会创建我们的lab49命名空间(只是个JavaScript对象),而且每个使用这种结构的后续文件都只不过是重用这个现有实例。
私有状态(Private State)
正如我们刚才所说,由于位于函数内部,在其内部声明的一切内容都是处于该函数的范围内,而不是全局范围。对于隔离我们的代码这真太棒了,此外,它还有个影响是,没有人能调用它。中看不中用。
刚刚我们还谈到,我们创建了window.lab49对象来有效管地理我们内容的命名空间。而且这个lab49变量是全局可用的,因为它被附加到window对象上。要想把我们模块中的内容暴露给外部,你可以公开地说,我们要做的就是把一些值附加到全局变量上。正如我们在上例中对add函数所做的一样。现在,在我们的模块外部可以通过lab49.add 2, 2 来调用我们的add函数了。
在此函数内声明我们的值的另一结果是,如果某个值不是通过将其附加到我们的全局命名空间或者模块外部的某物的方法来显示公开的,那么外部代码将无法碰到它。事实上,我们刚刚就创建了一些私有值。
CommonJS模块(CommonJS
文档评论(0)