Javascript模块化编程(一)模块的写法最佳实践


Posted in Javascript onJanuary 17, 2013

随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂。
Javascript模块化编程(一)模块的写法最佳实践 
网页越来越像桌面程序,需要一个团队分工协作、进度管理、单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑。

Javascript模块化编程,已经成为一个迫切的需求。理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块。

但是,Javascript不是一种模块化编程语言,它不支持"类"(class),更遑论"模块"(module)了。(正在制定中的ECMAScript标准第六版,将正式支持"类"和"模块",但还需要很长时间才能投入实用。)

Javascript社区做了很多努力,在现有的运行环境中,实现"模块"的效果。本文总结了当前"Javascript模块化编程"的最佳实践,说明如何投入实用。虽然这不是初级教程,但是只要稍稍了解Javascript的基本语法,就能看懂。
Javascript模块化编程(一)模块的写法最佳实践 
一、原始写法
模块就是实现特定功能的一组方法。
只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块。

 function m1(){ 

//... 

} 

function m2(){ 


//... 

}

上面的函数m1()和m2(),组成一个模块。使用的时候,直接调用就行了。
这种做法的缺点很明显:"污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系。
二、对象写法
为了解决上面的缺点,可以把模块写成一个对象,所有的模块成员都放到这个对象里面。
var module1 = new Object({ 

_count : 0, 


m1 : function (){ 



//... 


}, 


m2 : function (){ 



//... 


} 

});

上面的函数m1()和m2(),都封装在module1对象里。使用的时候,就是调用这个对象的属性。
module1.m1();

但是,这样的写法会暴露所有模块成员,内部状态可以被外部改写。比如,外部代码可以直接改变内部计数器的值。
module1._count = 5;

三、立即执行函数写法
使用"立即执行函数"(Immediately-Invoked Function Expression,IIFE),可以达到不暴露私有成员的目的。
var module1 = (function(){ 

var _count = 0; 


var m1 = function(){ 



//... 


}; 


var m2 = function(){ 



//... 


}; 


return { 



m1 : m1, 



m2 : m2 


}; 

})();

使用上面的写法,外部代码无法读取内部的_count变量。
console.info(module1._count); //undefined

module1就是Javascript模块的基本写法。下面,再对这种写法进行加工。
四、放大模式
如果一个模块很大,必须分成几个部分,或者一个模块需要继承另一个模块,这时就有必要采用"放大模式"(augmentation)。
var module1 = (function (mod){ 

mod.m3 = function () { 



//... 


}; 


return mod; 

})(module1);

上面的代码为module1模块添加了一个新方法m3(),然后返回新的module1模块。
五、宽放大模式(Loose augmentation)
在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。如果采用上一节的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用"宽放大模式"。
var module1 = ( function (mod){ 

//... 


return mod; 

})(window.module1 || {});

与"放大模式"相比,"宽放大模式"就是"立即执行函数"的参数可以是空对象。
六、输入全局变量
独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。
为了在模块内部调用全局变量,必须显式地将其他变量输入模块。
var module1 = (function ($, YAHOO) { 

//... 

})(jQuery, YAHOO);

上面的module1模块需要使用jQuery库和YUI库,就把这两个库(其实是两个模块)当作参数输入module1。这样做除了保证模块的独立性,还使得模块之间的依赖关系变得明显。

这个系列的第二部分,将讨论如何在浏览器环境组织不同的模块、管理模块之间的依赖性。
(完)

Javascript 相关文章推荐
JavaScript var声明变量背后的原理示例解析
Oct 12 Javascript
javascript中Number对象的toString()方法分析
Dec 20 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
Mar 06 Javascript
Javascript 判断两个IP是否在同一网段实例代码
Nov 28 Javascript
bootstrap实现每隔5秒自动轮播效果
Dec 20 Javascript
基于LayUI实现前端分页功能的方法
Jul 22 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
jQuery删除/清空指定元素的所有子节点实例代码
Jul 04 jQuery
JavaScript的查询机制LHS和RHS解析
Aug 16 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
Dec 13 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
Nov 24 Javascript
Javascript异步编程的4种方法让你写出更出色的程序
Jan 17 #Javascript
jQuery链式操作如何实现以及为什么要用链式操作
Jan 17 #Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
Jan 17 #Javascript
JavaScript控制Session操作方法
Jan 17 #Javascript
file模式访问网页时iframe高度自适应解决方案
Jan 16 #Javascript
jquery如何改变html标签的样式(两种实现方法)
Jan 16 #Javascript
jquery选择器的选择使用及性能介绍
Jan 16 #Javascript
You might like
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
Yii2中使用join、joinwith多表关联查询
2016/06/30 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
PHP之认识(二)关于Traits的用法详解
2019/04/11 PHP
ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
jQuery选择器源码解读(八):addCombinator函数
2015/03/31 Javascript
JavaScript判断按钮被点击的方法
2015/12/13 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
微信小程序使用echarts获取数据并生成折线图
2019/10/16 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
js实现列表向上无限滚动
2020/01/13 Javascript
vue实现计算器功能
2020/02/22 Javascript
vue+element获取el-table某行的下标,根据下标操作数组对象方式
2020/08/07 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
python中List的sort方法指南
2014/09/01 Python
django foreignkey(外键)的实现
2019/07/29 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
Html5页面二次分享的实现
2018/07/30 HTML / CSS
bareMinerals官网:矿物质化妆品和护肤品
2018/02/04 全球购物
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
《小山羊和小灰兔》教学反思
2014/02/19 职场文书
三年级评语大全
2014/04/23 职场文书
学雷锋活动总结范文
2014/04/25 职场文书
个人作风建设自查报告
2014/10/22 职场文书
感恩老师主题班会
2015/08/12 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript
剧场版《转生恶役只好拔除破灭旗标》公开最新视觉图 2023年上映
2022/04/02 日漫