以前在进行软件开发的时候,我一直都是用全局变量来进行函数之间的通信,因为当时学习并理解的方法也就这种方便快捷易懂,不过写多了之后发现,使用全局变量其实有比较多的坏处:
在开发的初期阶段,一般是先搭建框架,实现最基本的功能,把全部功能函数写在一个文件里,要是需要在两个函数之间进行通信,就定义一个全局变量,在这个函数实现这个操作,在那个函数实现那个操作,诸如此类的。在代码量比较少,协同开发人员比较少的情况下,这样写是没什么问题,相反还比较方便,因为比较浅显。但如果功能要进行迭代开发呢?根据用户需求进行新功能的开发呢?原有模块要去掉呢?等等可能的情况。要是还使用全局变量的话,就是导致全局变量过多,令函数与函数之间的耦合度增加,在后期维护检测代码的时候需要不停梳理代码情况,增加维护成本。
同时因为协同开发,每个人都有自己负责的模块,要是每个人都定义一些全局变量,你无法知道每一个人写出来的全局变量的作用,全局变量作用于哪些函数内,要是删除了,会造成什么影响,这些都是不可预料的后果,大大增加了后期开发的难度。
综上所述,在开发中一般少用或不用全局变量。在C++或java等面向对象语言中,提供了类和对象的使用方法,我们可以通过对成员及方法进行封装来达到模块化的目的,同时可以通过对象与对象之间的通信来减低功能模块之间的耦合度。但是最近在进行JavaScript开发的时候,由于JS本身不提供类的封装等功能,属于弱语言,加上对JS的不熟悉,导致在开发中又走回了原点,使用全局变量来进行函数之间的通信,写着写着就发现不对了,不能这样写,于是开始思考JS的封装方式。
最简单直接的方法就是创建对象,例程如下:
var temp=
{
time:undefined, //对象成员
countTime:function(){} //对象方法
}
注意:对象之间需要用逗号隔开;对象成员一定要用定义,要是不知道类型,可以用undefined来定义,总之一定要有值。
现在我以一个计时函数作为例子来进行说明,首先,我定义的对象是这样的:
var CountTimeObject= {
counter: 0,
SecU: 0,
SecD: 0,
MinU: 0,
MinD: 0,
HourU: 0,
HourD: 0,
CleatTimeCount:,
CountTime: function(){
SecU = parseInt(((counter) % 60) % 10);
SecD = parseInt((counter % 60) / 10);
MinU = parseInt(((counter / 60) % 60) % 10);
MinD = parseInt(((counter / 60) % 60) / 10);
HourU = parseInt((counter / 3600) % 10);
HourD = parseInt((counter / 3600) / 10);
counter = counter+ 1;
$('SecU').set('text',SecU);
$('SecD').set('text',SecD);
$('MinU').set('text',MinU);
$('MinD').set('text',MinD);
$('HourU').set('text',HourU);
$('HourD').set('text',HourD);
CleatTimeCount = setTimeout("CountTime()",1000);
},
CountTimePlus: function() {
clearTimeout(CleatTimeCount);
counter = 0;
SecU = 0;
SecD = 0;
MinU = 0;
MinD = 0;
HourU = 0;
HourD = 0;
CountTime();
}
};
在第一次调试的时候怎么都不成功,检查过后才发现所有对象都要赋值才行,因为我想着一开始不给值的,等使用的时候再初始化,结果发现不行。
后来做了修改,如下:
CleatTimeCount:undefined, //加上定义
这次是在使用中出现问题,提示使用的变量没有被定义,最后查询的结果是没有表明使用的变量的作用对象,再次修改如下:
var CountTimeObject= {
counter: 0,
SecU: 0,
SecD: 0,
MinU: 0,
MinD: 0,
HourU: 0,
HourD: 0,
CleatTimeCount: undefined,
CountTime: function(){
this.SecU=parseInt(((this.counter) % 60) % 10);
this.SecD=parseInt((this.counter % 60) / 10);
this.MinU=parseInt(((this.counter / 60) % 60) % 10);
this.MinD=parseInt(((this.counter / 60) % 60) / 10);
this.HourU=parseInt((this.counter / 3600) % 10);
this.HourD=parseInt((this.counter / 3600) / 10);
this.counter= this.counter+ 1;
$('SecU').set('text',this.SecU);
$('SecD').set('text',this.SecD);
$('MinU').set('text',this.MinU);
$('MinD').set('text',this.MinD);
$('HourU').set('text',this.HourU);
$('HourD').set('text',this.HourD);
This.CleatTimeCount=setTimeout("this.CountTime()",1000);
},
CountTimePlus: function() {
clearTimeout(this.CleatTimeCount);
this.counter= 0;
this.SecU= 0;
this.SecD= 0;
this.MinU= 0;
this.MinD= 0;
this.HourU= 0;
this.HourD= 0;
this.CountTime();
}
};
这次还是出现了问题,计时器代码只运行了一次就停了,后面是乱码,这里耗费了我大量的时间去查阅资料,最后得到一个结果,在setTimeout()函数里,用this引用当前对象的成员函数会导致成员查找失败,应该使用对象名引用对象成员方法,最终版本代码如下:
var CountTimeObject = {
counter: 0,
SecU: 0,
SecD: 0,
MinU: 0,
MinD: 0,
HourU: 0,
HourD: 0,
CleatTimeCount: undefined,
CountTime: function(){
CountTimeObject.SecU =parseInt(((CountTimeObject.counter)% 60) % 10);
CountTimeObject.SecD =parseInt((CountTimeObject.counter% 60) / 10);
CountTimeObject.MinU =parseInt(((CountTimeObject.counter/ 60) % 60) % 10);
CountTimeObject.MinD =parseInt(((CountTimeObject.counter/ 60) % 60) / 10);
CountTimeObject.HourU =parseInt((CountTimeObject.counter/ 3600) % 10);
CountTimeObject.HourD =parseInt((CountTimeObject.counter/ 3600) / 10);
CountTimeObject.counter =CountTimeObject.counter + 1;
$('SecU').set('text',CountTimeObject.SecU);
$('SecD').set('text',CountTimeObject.SecD);
$('MinU').set('text',CountTimeObject.MinU);
$('MinD').set('text',CountTimeObject.MinD);
$('HourU').set('text',CountTimeObject.HourU);
$('HourD').set('text',CountTimeObject.HourD);
CountTimeObject.CleatTimeCount =setTimeout("CountTimeObject.CountTime()", 1000);
},
CountTimePlus: function() {
clearTimeout(CountTimeObject.CleatTimeCount);
CountTimeObject.counter = 0;
CountTimeObject.SecU = 0;
CountTimeObject.SecD = 0;
CountTimeObject.MinU = 0;
CountTimeObject.MinD = 0;
CountTimeObject.HourU = 0;
CountTimeObject.HourD = 0;
CountTimeObject.CountTime();
}
};