最近看了编程精解里面的模块化一章,很受启发。

  /****************/

  在开发的实际过程中,根据页面或者逻辑布局,js代码可以按照功能划分为若干个区块:数据交互、表单验证、页面布局等等模块

  为了提高开发效率和后期代码维护,很自然的应该将几十个js函数划分为模块,利于调试和后续修改。但写出几十个函数的时候,命名自然就出现问题了,想不出别的函数名或者干脆两个函数重名了,这种因为重复声明而导致的bug称为命名污染,这在大型项目中很常见。

  提到模块开发,最容易想到的是通过js文件来分模块存储和调用代码。而文件存储的弊病是:比如首页加载了3,4个js文件(应该不算多),不同文件里面的全局变量,包括函数和变量,怎么保证不存在命名冲突,当然,通过给变量名和函数名前加前缀是一个很笨但是很奏效的办法,有没有什么办法能够从最基础上避免这种命名污染、同时能够实现代码模块化呢?

  

  1.通过模块对象来实现。

    举一个书中的例子,要做一个月份翻译器,把1翻译为一月。对于新手来讲很可能是这样的:

      

var names = ['一','二','三','四','五','六','七','八','九','十','十一','十二'];
function getMonthName(num){
return names[num-1]+'月';
};
function getMonthNum(str){
for(var i in names){
if( str == (names[i]+'月')){
return i+1;
}
}
};

  这里面的names和getMonthName,getMonthNum的生存域都是顶级的,所以如果其他文件或者js代码中声明了名字为names的变量,就会导致程序异常(getMonthName,getMonthNum这么长的名字一般很少重复)。

  在一个后台管理网站里面,需要写的函数可能有:表单验证、图片轮播组件、dom加载、从某input里面读数据再拼成json、hover效果、弹出层....如果这些功能或者插件都是直接声明全局函数或全局变量,想命名就会想哭的。

  

  所以这时候,应该想到利用函数闭包来避免产生作用域命名污染,上面代码的最简修改就是

  

//匿名函数声明并直接调用
//names作为局部变量出现 不会污染顶级作用域,外部无法访问
//通过为顶级作用域的window对象绑定函数的方式,对外暴露接口
(function(){
var names = ['一','二','三','四','五','六','七','八','九','十','十一','十二'];
window.getMonthName = function getMonthName(num){
return names[num-1]+'月';
};
window.getMonthNum = function getMonthNum(str){
for(var i in names){
if( str == (names[i]+'月')){
return i+1;
}
}
};
})();

  这种方法也有不好的地方,我们总不能把所有的函数接口都绑定到window对象的属性当中,那和直接在代码里声明函数没区别。

  所以,再一步优化就是做模块对象,很简单的优化,把函数绑定到模块对象上,通过访问模块对象的属性来调用功能:

  

  

var monthTranslator = (function(){
var names = ['一','二','三','四','五','六','七','八','九','十','十一','十二'];
return {
getMonthName:function(num){
return names[num-1]+'月';
},
getMonthNum:function(str){
for(var i in names){
if( str == (names[i]+'月')){
return i+1;
}
}
}
};
})();

  上面的函数调用时,直接使用 monthTranslator.getMonthName(1);  就可以了。当然也可以把names作为模块对象的属性出现,这就看功能设计了。

  /*************/

  上面说的这些就是js代码的模块化,这个见仁见智,有的人可能觉得你这种写法有什么用处呢,“我自己想个命名前缀不就得了,有必要写这么麻烦的函数么”

  但是我觉得,良好的代码风格是一个程序员的优良品德。对人对己,都是极好的。

  

[补]1.继承方式的实现:冒充对象

 function Parent(){
this.name = 'parent';
this.count = 0;
this.info = function(){
return [this.name,':',this.count.toString()].join('');
}
}
function Son(){
this.inherit = Parent;
this.inherit();
delete this.inherit;
this.flag = 'son';
this.count = 1;
}
var son = new Son();

[补]2.继承方式的实现:原型链的修改和维护 对象.constructor = 构造器.prototype.constructor(原型链末端闭环)

function Parent(){
this.name = 'parent';
this.count = 0;
this.info = function(){
return [this.name,':',this.count.toString()].join('');
}
}
function Son(){
this.constructor = arguments.callee;
this.flag = 'son';
this.count = 1;
}
Son.prototype = new Parent();
var son = new Son();

[javascript]模块化&命名污染—from 编程精解的更多相关文章

  1. [已读]JavaScript编程精解

    译者汤姆大叔,应该很多人都知道,他写了一系列的关于闭包与作用域理解的文章,但是由于创建了一些我不理解的新名词,我不爱看. <JavaScript编程精解>算是买得比较早的一本书,那会大肆搜 ...

  2. [javascript] postmessage

    摘要 postmessage 作为 html5 跨域传值的解决方法,灰常好用啊..本次用的是页面a 用iframe 嵌入 页面b. 使用方法 postmessage 参数 otherWindow.po ...

  3. JavaScript编程精解 初读笔记

    1.1 值 JavaScript里有6种基本类型的值: number.string.Boolean.object.function和undefined. 1.3.2 prompt和confirm 浏览 ...

  4. 《JavaScript编程精解》读书笔记

    第一章 JavaScript基础:值.变量.控制流程 JavaScript里有六种基本类型:number类型.string类型.boolean类型.object.function和undefined. ...

  5. java网络编程精解demo1---读取用户控制台的输入的数据并显示

    package test3; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream ...

  6. js编程精解--笔记

    看这本书的目的是为了更好的使用mongodb,所以只看js编程语言基础,不看浏览器和画布. 需要看1-11章,共160页 第一章 值.类型和运算符 第二章 程序结构 第三章 函数 第四章 数据结构:对 ...

  7. javascript中模块化知识总结

    JavaScript 模块化开发 1. 模块化介绍 掌握模块化基本概念以及使用模块化带来的好处 当你的网站开发越来越复杂的时候,会经常遇到什么问题? 恼人的命名冲突 繁琐的文件依赖 历史上,JavaS ...

  8. 关于JavaScript的模块化

    为什么需要模块化 最近在学习网易微专业的<前端系统架构>课程,里面讲到了关于JavaScript的模块化问题.具体指的是当随着Web系统不断强大起来,需要在客户端进行的操作就多了起来(比如 ...

  9. Java基础 之软引用、弱引用、虚引用 ·[转载]

    Java基础 之软引用.弱引用.虚引用 ·[转载] 2011-11-24 14:43:41 Java基础 之软引用.弱引用.虚引用 浏览(509)|评论(1)   交流分类:Java|笔记分类: Ja ...

随机推荐

  1. halcon连续采集图像

    dev_close_window()dev_update_window('off')create_bar_code_model ([], [], BarCodeHandle)dev_open_wind ...

  2. 基于ARP的局域网IP劫持——C语言实现

      我站在 烈烈风中   恨不能 荡尽绵绵心痛   望苍天 四方云动   剑在手   问天下谁是英雄 ——<霸王别姬> 阅读这篇文章之前,请确认已经熟悉ARP报文伪造的方法,可参考< ...

  3. 汉字转拼音开源工具包Jpinyin介绍

    最近要实现一个根据词语得到词语对应拼音的功能,找到了Jpinyin这个开源工具包,使用下来发现它非常强大,完全满足我的需求,下面对它做一个简单的介绍,希望能够帮助到有需要的朋友. https://gi ...

  4. atl控件发布打包<转>

    http://www.cnblogs.com/gengaixue/archive/2010/08/13/1799112.html ActiveX打包与发布 在VS2005或VS2008安装后发现路径* ...

  5. 【&nbsp;Makefile&nbsp;编程基础之…

    本站文章均为李华明Himi原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/766.html 概述: ...

  6. maven如何引入servlet-api和jsp-api

    废话不多说,直接上代码 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax. ...

  7. 2017年Java学习总结

    2017年Java学习      Java,是我学习的第三种计算机编程语言,刚拿到这本教材时,我被它的厚度与书中字体的密集程度吓了一跳,不过在学习过程中,有Python,C语言的学习基础上,加上老师的 ...

  8. Linux实战教学笔记36:PHP服务缓存加速深度优化实践

    一,PHP缓存加速器介绍与环境准备 1.1 PHP缓存加速器介绍 1.1.1 操作码介绍及缓存原理 当客户端请求一个PHP程序时,服务器的PHP引擎会解析该PHP程序,并将其编译为特定的操作码(Ope ...

  9. 少一些套路,多一些真诚 ——groovy消灭表现层套路

      初次认识groovy是在2009年,当时看了Manning出版的<Groovy in Action 1st Edition>,对groovy这个语言的交互性shell,以及灵活的语法留 ...

  10. Activiti 乱码问题

    新版本运行起来中文看起来正常了许多,至少生成图片过程中不会出现乱码了,但不出预料的再次遇到部署时乱码问题,除了保存时报错,还会导致流程实例的节点名称是乱码. 1. IE报错定义时错误提示: 元素类型 ...