本文介绍如何使用 JavaScript 命名空间模式解决全局变量冲突问题。通过构建类似 Java 包结构的代码库(如 ziggy_js),实现 UI、数组处理、浏览器信息及日期时间等功能的模块化封装。文章提供了具体的代码示例,展示如何定义对象、方法以及安全导入外部脚本,帮助开发者建立清晰、可维护的前端代码架构。
JavaScript 命名空间模式:防止全局变量冲突的实战指南
为避免命名冲突,需构建专属代码库。
例如
基础 UI 模块封装
JS代码
代码如下:
ziggy_js=function(){}
ziggy_js.ui=function(){}
ziggy_js.ui.alerts=function(){}
ziggy_js.ui.alerts.showErrorAlert=function(){
alert("An error occurred");
}
ziggy_js.ui.alerts.showErrorAlert();
//用于定义类
ziggy_js.ui.alerts.messageDisplayer=function(inMsg){
this.msg=inMsg;
this.toString=function(){
return "msg="+this.msg;
}
}
var v=new ziggy_js.ui.alerts.messageDisplayer("hello");
alert(v);
ziggy_js=function(){}
ziggy_js.ui=function(){}
ziggy_js.ui.alerts=function(){}
ziggy_js.ui.alerts.showErrorAlert=function(){
alert("An error occurred");
}
ziggy_js.ui.alerts.showErrorAlert();
//也可用于定义类
ziggy_js.ui.alerts.messageDisplayer=function(inMsg){
this.msg=inMsg;
this.toString=function(){
return "msg="+this.msg;
}
}
var v=new ziggy_js.ui.alerts.messageDisplayer("hello");
alert(v); 由此建立个人代码库。此外,页面中也可直接导入。
类似Java中的包机制
首先需检测ziggy是否已被占用
安全导入与字符串模块
JS代码
代码如下:
//在ziggy_js.string.js中编写
if(typeof ziggy_js=='undefined'){
ziggy_js=function(){};
}
ziggy_js.string=function(){}
ziggy_js.string.test=function(inMsg){
alert(inMsg);
}
//页面中可导入
<script src="ziggy_js.string.js"></script>
//在ziggy_js.string.js中编写
if(typeof ziggy_js=='undefined'){
ziggy_js=function(){};
}
ziggy_js.string=function(){}
ziggy_js.string.test=function(inMsg){
alert(inMsg);
}
//页面中可导入
<script src="ziggy_js.string.js"></script> 创建处理数组的包ziggy_js.array
数组处理工具库
JS代码
代码如下:
ziggy_js.array=function(){}
//复制数组
ziggy_js.array.copyArray=function(inSrcArray,inDestArray){
var i;
for(i=0;i<inSrcArray.length;i++){
inDestArray.push(inSrcArrsy[i]);
}
return inDestArray;
//end copyArray
ziggy_js.array.findInArray=function(inArray,inValue){
var i;
for(i=0;i<inArray.length;i++){
if(inArray[i]==inValue){
return i;
}
}
return -1;
//end findInArray
.....
ziggy_js.array=function(){}
//复制数组
ziggy_js.array.copyArray=function(inSrcArray,inDestArray){
var i;
for(i=0;i<inSrcArray.length;i++){
inDestArray.push(inSrcArrsy[i]);
}
return inDestArray;
//end copyArray
ziggy_js.array.findInArray=function(inArray,inValue){
var i;
for(i=0;i<inArray.length;i++){
if(inArray[i]==inValue){
return i;
}
}
return -1;
//end findInArray .....
创建ziggy_js.browser以获取浏览器信息
浏览器信息获取
JS代码
代码如下:
ziggy_js.browser=function(){}
ziggy_js.browser.getBrowserIdentity=function(){
return navigator.appName+" "+navigator.appVersion;
//end getBrowserIdentity
var brow=ziggy_js.browser.getBrowserIdentity();
alert(brow);
ziggy_js.browser=function(){}
ziggy_js.browser.getBrowserIdentity=function(){
return navigator.appName+" "+navigator.appVersion;
//end getBrowserIdentity
var brow=ziggy_js.browser.getBrowserIdentity();
alert(brow); 处理时间的包。
日期与时间处理模块
JS代码
代码如下:
ziggy_js.dateTime=function(){}
ziggy_js.dateTime.isLeapYear=function(inYear){
if((inYear%4==0&&inYear%100!=0)||inYear%400==0){
return true;
}else{
return false;
}
//end isLeapYear
ziggy_js.dateTime.getNumberDaysInMonth=function(inMonth,inYear){
inMonth=inMonth-1;
var leap_year=this.isLeapYear(inYear);
if(leap_year){
leap_year=1;
}else{
leap_year=0;
}
if(inMonth==3||inMonth==5||inMonth==8||inMonth==10){
return 30;
}else if(inMonth==1){
return 28+leap_year;
}else{
return 31;
}
//end getNumberDaysInMonth
var days=ziggy_js.dateTime.getNumberDaysInMonth(2,2007);
alert(days);
ziggy_js.dateTime=function(){}
ziggy_js.dateTime.isLeapYear=function(inYear){
if((inYear%4==0&&inYear%100!=0)||inYear%400==0){
return true;
}else{
return false;
}
//end isLeapYear
ziggy_js.dateTime.getNumberDaysInMonth=function(inMonth,inYear){
inMonth=inMonth-1;
var leap_year=this.isLeapYear(inYear);
if(leap_year){
leap_year=1;
}else{
leap_year=0;
}
if(inMonth==3||inMonth==5||inMonth==8||inMonth==10){
return 30;
}else if(inMonth==1){
return 28+leap_year;
}else{
return 31;
}
//end getNumberDaysInMonth
var days=ziggy_js.dateTime.getNumberDaysInMonth(2,2007);
alert(days); 逐步完善