文档章节

JavaScript模块化开发(一)基础知识

Enjoy前端开发
 Enjoy前端开发
发布于 2015/03/23 16:34
字数 1003
阅读 9
收藏 0

随着前段JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试。模块化是一种非常好的代码组织方式,本文试着对JavaScript模块化开发的一些基础知识做一些阐释。


对象字面量(Object Literals)

对象字面量表示,其实就是用一对大括号括起来的键值对,也就是JavaScript声明对象的方式。

    
var myObject = { variableKey : variableValue, functionKey : function() { ... } }

比较一下下面代码声明方式,使用对象字面量表示,可以减少全局变量的污染,一般来说,强烈建议在任何时候都不要使用下面的声明方式:


var variableName = ...; function name1(){ ... } function name2(){ ... }

立即执行函数(IIFE Immediately-Invoked Function Expressions)

立即执行函数是现在非常流行的写法,大部分JS库都使用了这种技巧,主要是防止全局变量的污染。

当我们在声明类似于var name1 = function (){ … }这样的函数时,在后面加一对括号 (),就可以让它立即执行,但是如果是function name1() { … }这样的函数,则会有问题:

function name1(){ alert("123"); }();

上面代码在执行时会抛出错误,Unexpected token(意外的标记),因为后面的()会被解析为分组操作符

解决上面的问题,只需要加上括号将function代码全部括住即可,下面就是立即执行函数的声明方式:

(function () { /* code */ } ()); (function () { /* code */ })();
注意,上面两种方式都是可以的,主要看个人习惯。立即执行函数可以不对外暴露私有变量,比如:
var myObject = { name : "FeeldesignStudio", getName : function(){ return this.name; } }; myObject.name; //FeeldesignStudio myObject.getName(); //FeeldesignStudio var myObject = (function(){ var name = "FeeldesignStudio"; return { getName : function(){ return name; } } })(); myObject.name; //出错! myObject.getName(); //FeeldesignStudio

导入全局变量

把全局变量作为参数传递给一个立即执行函数,这样就完成了全局变量的导入,立即执行函数中可以使用此全局变量的方法,并可以修改(简化)全局变量的名称:

var myModule = (function ( jQ ) { function method1(){ jQ(".container").html("test"); } return{ publicMethod: function(){ method1(); } }; })( jQuery ); myModule.publicMethod();

模块导出

当然,有导入也可以有导出,有时我们不仅要导入全局变量,也要把模块导出到全局空间供其他模块使用。通过在立即执行函数中返回一个Object,就可以实现模块导出功能:

var myModule = (function () { var module = {}, privateVariable = "Feeldesign"; function privateMethod() { // ... } module.publicProperty = "FeeldesignStudio"; module.publicMethod = function () { console.log( privateVariable ); }; return module; })();

扩展模块

在开发中,我们经常会对一些模块进行扩展,扩展当然可以直接修改模块的源代码,但是这不是一个好的方法,比如我们要给 myModule 模块增加几个方法,通过前面的“立即执行函数”、“导入全局变量”、“模块导出”的知识,我们可以推导出下面的扩展方式:

var myModule = (function ( my ) { my.xxMethod = function () { ... }; return my; })( myModule );
问题来了:上面的代码可以很好地对 myModule 进行扩展,不过前提是 myModule 必须已经定义,如果扩展的 xxMethod 方法和 myModule 本身没有任何的依赖,那么要求 myModule 必须已经定义就毫无必要了,怎么解决这个问题呢,非常简单,只需要或一个空对象:

//松散扩展 var myModule = (function ( my ) { my.xxMethod = function () { ... }; return my; })( myModule || {} );
上述代码还存在一个问题,那就是如果a.js中声明了var myModule = …,b.js中也声明了var myModule = …,这样在引入a.js和b.js时,后者会将前者覆盖,这并不是我们期望的,所以对上述代码,可以再加改进:

(function ( my ) { my.xxMethod = function () { ... } })( window.myModule = window.myModule || {} );
上面把JavaScript模块化开发的基础知识作了介绍,接下来,会进一步介绍常见的规范和针对这些规范的一些js库实现,通过这些js库,我们可以很好的将模块化开发赋予实施。


本文转载自:http://www.feeldesignstudio.com/2013/09/javascript-module-pattern-basics/

共有 人打赏支持
Enjoy前端开发
粉丝 3
博文 27
码字总数 3417
作品 0
海淀
私信 提问
手把手教你撸一个简易的 webpack

背景 随着前端复杂度的不断提升,诞生出很多打包工具,比如最先的,。到后来的和。但是目前很多脚手架工具,比如已经帮我们集成了一些构建工具的使用。有的时候我们可能并不知道其内部的实现...

muwoo
06/07
0
0
React-Native入门指南(二)——代码结构

React-Native入门指南 github:https://github.com/vczero/react-native-lession React-Native:用JavaScript开发你的原生应用,释放Native的UI体验,体验 Hybird开发效率。 最近一个星期写的文...

vczero
2015/06/29
0
0
手把手教你用原生JavaScript造轮子(1)——分页器

日常工作中经常会发现有大量业务逻辑是重复的,而用别人的插件也不能完美解决一些定制化的需求,所以我决定把一些常用的组件抽离、封装出来,形成一套自己的插件库。同时,我将用这个教程系列...

csdoker
07/26
0
0
零基础的网站开发初学者如何系统的学习?

A.学习背景 开始网站开发,起先是从手机网站的UBB语法开始的,也因此有了深入学习的兴趣。为了让学习的热情膨胀,我有意的培养这一爱好 ,定位了自己要成为一名优秀的网站开发员的目标。 作为...

李佳顺
2012/12/25
0
3
结合个人经历总结的前端入门方法

作者:qiu deqing 链接:https://github.com/qiu-deqing/FE-learning 结合个人经历总结的前端入门方法,总结从零基础到具备前端基本技能的道路、学习方法、资料。由于能力有限,不能保证面面...

SomaLihq
06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
28分钟前
1
0
hadoop垃圾回收站

在生产生,hdfs回收站必须是开启的,一般设置为7天。 fs.trash.interval 为垃圾回收站保留时间,如果为0则禁用回收站功能。 fs.trash.checkpoint.interval 回收站检查点时间,一般设置为小于...

hnairdb
昨天
1
0
腾讯与Github的魔幻会面背后的故事…

10月22日,腾讯开源管理办公室有幸邀请到Github新晋CEO Nat Friedman,前来鹅厂参观交流。目前腾讯已经有近70个项目在Github上开源,共获得17w stars,世界排名11位。Github是腾讯开源的主阵...

腾讯开源
昨天
1
0
单例模式

单例模式(Singleton pattern)属于创建型设计模式。 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对...

NinjaFrog
昨天
1
0
TypeScript基础入门之装饰器(三)

转载 TypeScript基础入门之装饰器(三) 继续上篇文章[TypeScript基础入门之装饰器(二)] 访问器装饰器 Accessor Decorator在访问器声明之前声明。 访问器装饰器应用于访问器的属性描述符,可用...

durban
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部