1.闭包的概念
就我个人使用过程中的理解,闭包就是将某个功能集合通过函数封装成一个模块,对外暴露一个接口,只可以通过此接口去访问,闭包中的其他成员对于其他的模块是隐藏的,限制了作用域,减少了名称冲突的发生.
2.闭包的作用
封装一些通用的功能供多个模块使用,不用担心各个模块内出现命名冲突.
3.如何开发闭包
闭包一般使用一个自包含函数包裹,具体做法如下:
1.添加一个js文件,js文件内部使用这样的形式(function(){ ..封转的功能函数区.. }())
2.功能函数写法 var xxx = function(paramater){};
3.对外暴露接口 var Init = function(){
return {
xxx:xxx,
xxx:xxx
};
}
3.对外暴露接口通过window.模块名 = Init;
下面是一个例子,这个例子是处理时间的模块:
(function () {
var getCalcuQuarter = function (month) {
return Math.floor((month % 3 == 0 ? (month / 3) : (month / 3 + 1)));
};
var getFormatTime = function (time, format) {
var args = {
"M+": time.getMonth() + 1,
"d+": time.getDate(),
"h+": time.getHours(),
"m+": time.getMinutes(),
"s+": time.getSeconds(),
"q+": Math.floor((time.getMonth() + 3) / 3), //quarter
"S": time.getMilliseconds()
};
if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (time.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var i in args) {
var n = args[i];
if (new RegExp("(" + i + ")").test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? n : ("00" + n).substr(("" + n).length));
}
return format;
}
var getOutputFormatTime = function (startTime, endTime, type) {
type = type + '';
var timeStr = "";
var start = new Date(startTime);
var end = new Date(endTime);
var year = start.getFullYear();
var month = start.getMonth() + 1;
var day = start.getDate();
var hour = start.getHours();
var min = start.getMinutes();
//var mil = start.getMilliseconds();
var endyear = end.getFullYear();
var endmonth = end.getMonth() + 1;
var endday = end.getDate();
var endhour = end.getHours();
var endmin = end.getMinutes();
//var endmil = end.getMilliseconds();
switch (type) {
case '5m':
timeStr = year + "年" + month + "月" + day + "日" + hour + "时" + min + "分钟";
timeStr = timeStr + "_" + endyear + "年" + endmonth + "月" + endday + "日" + endhour + "时" + endmin + "分钟";
break;
case 'hour':
timeStr = year + "年" + month + "月" + day + "日" + hour + "时";
timeStr = timeStr + "_" + endyear + "年" + endmonth + "月" + endday + "日" + endhour + "时";
break;
case 'day':
timeStr = year + "年" + month + "月" + day + "日";
timeStr = timeStr + "_" + endyear + "年" + endmonth + "月" + endday + "日";
break;
case 'month':
timeStr = year + "年" + month + "月";
break;
case 'quarter':
timeStr = year + "年第" + getCalcuQuarter(month) + "季度";
break;
case 'year':
timeStr = year + "年";
break;
default:
timeStr = "";
}
return timeStr;
}
var getFirstDayToMonth = function (Month) {
var t1 = Month;
var t2 = new Date(t1);
var t3 = new Date(t2.setFullYear(t2.getFullYear(), t2.getMonth(), 1));
var t4 = new Date(t3.setHours(00, 00, 00, 001));
return getFormatTime(t4, "yyyy-MM-dd hh:mm:ss");
};
var getLastDayToMonth = function (Month) {
var t1 = Month;
var t2 = new Date(t1);
var t3 = new Date(t2.setFullYear(t2.getFullYear(), t2.getMonth() + 1, 1));
var t4 = new Date(t3.setHours(0, 0, 0, 0));
var t5 = new Date(t4.getTime() - 24 * 60 * 60 * 1000);//一月中的最后一天
var t6 = new Date(t5.setHours(23, 00, 00, 000));
return getFormatTime(t6, "yyyy-MM-dd hh:mm:ss");
};
var getFirstDayToYear = function (Year) {
var t1 = new Date(Year);
var t2 = new Date(t1.setFullYear(t1.getFullYear(), 0, 1));
var t3 = getFirstDayToMonth(t2);
return t3;
};
var getLastDayToYear = function (Year) {
var t1 = new Date(Year);
var t2 = new Date(t1.setFullYear(t1.getFullYear(), 11, 1));
var t3 = getLastDayToMonth(t2);
return t3;
}
var getCheckTimeResult = function (startid, endid, timeType) {
var start = $("#" + startid).val();
var starttime = $("#" + startid).data(timeType).value()
var errorQueue = [];
var end = $("#" + endid).val();
var endtime = $("#" + endid).data(timeType).value()
if (start == "") {
errorQueue.push("请选择开始时间!");
return {
IsSuccess: false,
ErrorQueue: errorQueue,
ErrorNumber: 1,
ErrorEndNumber: 0
};
} else if (end == "") {
errorQueue.push("请选择结束时间!");
return {
IsSuccess: false,
ErrorQueue: errorQueue,
ErrorNumber: 1,
ErrorEndNumber: 1
};
}else if (starttime == null) {
errorQueue.push("开始时间格式无效,请注意时间格式与范围!");
return {
IsSuccess: false,
ErrorQueue: errorQueue,
ErrorNumber: 2,
ErrorEndNumber: 0
};
} else if (endtime == null) {
errorQueue.push("结束时间格式无效,请注意时间格式与范围!");
return {
IsSuccess: false,
ErrorQueue: errorQueue,
ErrorNumber: 2,
ErrorEndNumber: 1
};
}else if (starttime > endtime) {
errorQueue.push("开始时间不可大于结束时间!");
return {
IsSuccess: false,
ErrorQueue: errorQueue,
ErrorNumber: 3
};
} else
return {
IsSuccess: true,
ErrorQueue: errorQueue,
ErrorNumber: 4
};
};
var Init = function () {
return {
getCalcuQuarter: getCalcuQuarter,
getFormatTime: getFormatTime,
getOutputFormatTime: getOutputFormatTime,
getFirstDayToMonth: getFirstDayToMonth,
getLastDayToMonth: getLastDayToMonth,
getFirstDayToYear: getFirstDayToYear,
getLastDayToYear: getLastDayToYear,
getCheckTimeResult: getCheckTimeResult
};
};
window.CalcuDateTime = Init;
}())