实例讲解避免javascript冲突的方法


Posted in Javascript onJanuary 03, 2016

本文实例讲解了如何避免javascript中冲突的方法,需要的朋友可以了解一下

[1]工程师甲编写功能A

var a = 1;
var b = 2;
alert(a+b);//3

[2]工程师乙添加新功能B

var a = 2;
var b = 1;
alert(a-b);//1

[3]上一步中,工程师乙在不知情的情况下,定义了同名变量a,产生冲突。于是使用匿名函数将脚本包起来,让变量作用域控制在匿名函数之内。

//功能A
(function(){
var a = 1;

var b = 2;

alert(a+b);//3
})();
//功能B
(function(){

var a = 2;

var b = 1;

alert(a-b);//1
})();

[4]此时有了新需求,网页中加入功能C,且需要用到功能A中的变量b。于是在window作用域下定义一个全局变量,把它作为一个桥梁,完成各匿名函数之间的通信

//全局变量
var str;
//功能A
(function(){
var a = 1;

//将b的值赋给str

var b = str = 2;

alert(a+b);//3
})();
//功能B
(function(){

var a = 2;

var b = 1;

alert(a-b);//1
})();
//功能C
(function(){

//将str的值赋给b

var b = str;

alert(b);//2
})();

[5]但如果功能C还需要功能A中的变量a呢,这时就需要再定义一个全局变量

//全局变量
var str,str1;
//功能A
(function(){
//将a的值赋给str1

var a = str1 = 1;

//将b的值赋给str

var b = str = 2;

alert(a+b);//3
})();
//功能B
(function(){

var a = 2;

var b = 1;

alert(a-b);//1
})();
//功能C
(function(){

//将str1的值赋给a

var a = str1;

//将str的值赋给b

var b = str;

alert(a*b);//2
})();

[6]但随着匿名函数之间需要通信的变量越多,需要的全局变量也就越多。因此需要严格控制全局变量的数量,使用hash对象作为全局变量,可以将需要的变量都作为对象的属性,可以保证全局变量的个数足够少,同时拓展性非常好

//全局变量
var GLOBAL = {};
//功能A
(function(){
//将a的值赋给GLOBAL.str1

var a = GLOBAL.str1 = 1;

//将b的值赋给GLOBAL.str

var b = GLOBAL.str = 2;

alert(a+b);//3
})();
//功能B
(function(){

var a = 2;

var b = 1;

alert(a-b);//1
})();
//功能C
(function(){

//将GLOBAL.str1的值赋给a

var a = GLOBAL.str1;

//将GLOBAL.str的值赋给b

var b = GLOBAL.str;

alert(a*b);//2
})();

[7]但如果新增功能D,功能D需要和功能B通信,并使用功能B脚本中的变量a,开发功能D的是工程师丁

//全局变量
var GLOBAL = {};
//功能A
(function(){
//将a的值赋给GLOBAL.str1

var a = GLOBAL.str1 = 1;

//将b的值赋给GLOBAL.str

var b = GLOBAL.str = 2;

alert(a+b);//3
})();
//功能B
(function(){

//将a的值赋给GLOBAL.str1

var a = GLOBAL.str1 = 2;

var b = 1;

alert(a-b);//1
})();
//功能C
(function(){

//将GLOBAL.str1的值赋给a

var a = GLOBAL.str1;

//将GLOBAL.str的值赋给b

var b = GLOBAL.str;

alert(a*b);//2
})();
//功能D
(function(){

//将GLOBAL.str1的值赋给a

var a = GLOBAL.str1;

alert(a*2);//4
})();

[8]由于工程师丁只关心自己的匿名函数和功能B的匿名函数,使用GLOBAL.str却无意中覆盖了功能A中设置的同名变量,导致功能C出错。于是使用命名空间来解决这个问题,在不同的匿名函数下,根据功能声明一个不同的命名空间,然后每个匿名函数中的GLOBAL对象的属性都不要直接挂在GLOBAL对象上,而是挂在此匿名函数的命名空间下

//全局变量
var GLOBAL = {};
//功能A
(function(){
GLOBAL.A = {};

//将a的值赋给GLOBAL.A.str1

var a = GLOBAL.A.str1 = 1;

//将b的值赋给GLOBAL.A.str

var b = GLOBAL.A.str = 2;

alert(a+b);//3
})();
//功能B
(function(){

GLOBAL.B = {};

//将a的值赋给GLOBAL.B.str1

var a = GLOBAL.B.str1 = 2;

var b = 1;

alert(a-b);//1
})();
//功能C
(function(){

//将GLOBAL.A.str1的值赋给a

var a = GLOBAL.A.str1;

//将GLOBAL.A.str的值赋给b

var b = GLOBAL.A.str;

alert(a*b);//2
})();
//功能D
(function(){

//将GLOBAL.B.str1的值赋给a

var a = GLOBAL.B.str1;

alert(a*2);//4
})();

[9]如果同一个匿名函数中的程序非常复杂,变量名很多,命名空间还可以进一步拓展,生成二级命名空间

//以功能A为例
(function(){
var a = 1, b = 2;

GLOBAL.A = {};

GLOBAL.A.CAT = {};

GLOBAL.A.DOG = {};

GLOBAL.A.CAT.name = 'mimi';

GLOBAL.A.DOG.name = 'xiaobai';

GLOBAL.A.CAT.move = function(){};

GLOBAL.A.str1 = a;

GLOBAL.B.str = b;  
})();

[10]因为生成命名空间是个非常常用的功能,进一步将生成命名空间的功能定义成一个函数,方便调用,完整版本改写后的代码如下

var GLOBAL = {};
GLOBAL.namespace = function(str){
var arr = str.split('.');

var o = GLOBAL;

var start = 0;

if(arr[0] == 'GLOBAL'){


start = 1;

}else{


start = 0;

}

for(var i = start; i < arr.length; i++){


o[arr[i]] = o[arr[i]] || {};


o = o[arr[i]];

}
};
//功能A
(function(){

var a = 1;

var b = 2;

GLOBAL.namespace('A.CAT');

GLOBAL.namespace('A.DOG');

GLOBAL.A.CAT.name = 'mimi';

GLOBAL.A.DOG.name = 'xiaobai';

GLOBAL.A.CAT.move = function(){};

GLOBAL.A.str1 = a;

GLOBAL.A.str = b;  

alert(a+b);//3
})();
//功能B
(function(){

var a = 2;

var b = 1;

GLOBAL.namespace('B');

GLOBAL.B.str1 = a;

alert(a-b);//1
})();
//功能C
(function(){

var a = GLOBAL.A.str1;

var b = GLOBAL.A.str;

alert(a*b);//2
})();
//功能D
(function(){

var a = GLOBAL.B.str1;

alert(a*2);//4
})();

[11]代码的冲突问题已经解决了,但可维护性并不强。比如,现在需要让工程师甲去修改功能B。因为工程师甲写的脚本是关于功能A的,他并不知道功能B的脚本情况。为了改善这种局面,需要给代码添加适当的注释。

var GLOBAL = {};
GLOBAL.namespace = function(str){
var arr = str.split('.');

var o = GLOBAL;

var start = 0;

if(arr[0] == 'GLOBAL'){


start = 1;

}else{


start = 0;

}

for(var i = start; i < arr.length; i++){


o[arr[i]] = o[arr[i]] || {};


o = o[arr[i]];

}
};
/*
* @method 功能A:实现加法运算
* @author 工程师甲
* @connect 1234567
* @time 2015-01-01
*/

(function(){

var a = 1;

var b = 2;

GLOBAL.namespace('A.CAT');

GLOBAL.namespace('A.DOG');

GLOBAL.A.CAT.name = 'mimi';

GLOBAL.A.DOG.name = 'xiaobai';

GLOBAL.A.CAT.move = function(){};

GLOBAL.A.str1 = a;

GLOBAL.A.str = b;  

alert(a+b);//3
})();
/*
* @method 功能B:实现减法运算
* @author 工程师乙
* @connect 1234567
* @time 2015-01-01
*/
(function(){

var a = 2;

var b = 1;

GLOBAL.namespace('B');

GLOBAL.B.str1 = a;

alert(a-b);//1
})();
/*
* @method 功能C:实现乘法运算
* @author 工程师丙
* @connect 1234567
* @time 2015-01-01
*/
(function(){

var a = GLOBAL.A.str1;

var b = GLOBAL.A.str;

alert(a*b);//2
})();
/*
* @method 功能D:实现乘2运算
* @author 工程师丁
* @connect 1234567
* @time 2015-01-01
*/
(function(){

var a = GLOBAL.B.str1;

alert(a*2);//4
})();

让javascript不再冲突,需要

  •   [1]避免全局变量的泛滥
  • [2]合理使用命名空间

  • [3]为代码添加必要的注释

以上就是本文的详细内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
很酷的javascript loading效果代码
Jun 18 Javascript
javascript 获取网页参数系统
Jul 19 Javascript
Input 特殊事件onpopertychange和oninput
Jun 17 Javascript
jquery星级插件、支持页面中多次使用
Mar 25 Javascript
理解JAVASCRIPT中hasOwnProperty()的作用
Jun 05 Javascript
使用js对select动态添加和删除OPTION示例代码
Aug 12 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
Oct 27 Javascript
jQuery实现div拖拽效果实例分析
Feb 20 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
Mar 30 Javascript
JS实现的全排列组合算法示例
Oct 09 Javascript
基于three.js编写的一个项目类示例代码
Jan 05 Javascript
javascript Canvas动态粒子连线
Jan 01 Javascript
详解js中class的多种函数封装方法
Jan 03 #Javascript
js中利用tagname和id获取元素的方法
Jan 03 #Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
Jan 03 #Javascript
基于javascript实现简单计算器功能
Jan 03 #Javascript
详解Javascript事件驱动编程
Jan 03 #Javascript
基于javascript实现仿百度输入框自动匹配功能
Jan 03 #Javascript
js实现搜索框关键字智能匹配代码
Mar 26 #Javascript
You might like
学习使用PHP数组
2006/10/09 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
php过滤XSS攻击的函数
2013/11/12 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
PHP会话处理的10个函数
2015/08/11 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
2019/12/13 PHP
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
div模拟滚动条效果示例代码
2013/10/16 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
javascript中call,apply,bind的用法对比分析
2015/02/12 Javascript
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
jQuery实现信息提示框(带有圆角框与动画)效果
2015/08/07 Javascript
高性能JavaScript 重排与重绘(2)
2015/08/11 Javascript
JS实现网页标题随机显示名人名言的方法
2015/11/03 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
AngularJS基础 ng-focus 指令简单示例
2016/08/01 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
vue 实现走马灯效果
2019/10/28 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
2016/01/20 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
计算机专业推荐信范文
2013/11/27 职场文书
自荐信范文
2013/12/10 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python
tomcat下部署jenkins的方法
2022/05/06 Servers