在js模块化以前,工作过程中可能会遇到如下两种命名冲突的情况:
- 多人合作命名冲突
- 引入第三方库命名冲突
一、多人合作命名冲突
场景一、项目中有公共工具方法util.js,其中有个some方法,A开发过程中在自己的a.js中也定义了一个some方法,这是别人同时引用了util.js 和 a.js,这样就导致了each方法冲突,A只能改自己定义方法的名字,也通知用的人修改名字。
这种场景可以用命名空间的方式解决
1. 匿名函数
多人合作时,每个人都会写自己的js代码,容易造成变量名冲突。用匿名函数将脚本包起来,可以避免冲突。
// A
(function () {
var a = 1;
var b = 2;
console.log(a + b);
}());
// B
(function () {
var a = 2;
var b = 3;
console.log(a + b);
}());
2. 命名空间
上述匿名函数的方式可以解决局部作用域内变量命名冲突的问题,但是如果两个代码段需要访问彼此的变量,被分隔开就无法访问了。一般解决办法是把需要共享的变量挂载到全局对象window上面。但是这违背了我们使用匿名函数的初衷,又使用了全局变量,而全局变量是导致命名冲突的主要原因,应该减少全局变量的数量。
可以用对象作为全局变量,之后所有的共享变量都放到这个对象上
window.common = {};
window.common.str = 1;
这样还有个问题
A 存了window.common.str = 'A'
B存了window.common.str = 'B'
会发生覆盖的情况。
这时可以用命名空间的方式来解决。即window.common.命名空间.变量
window.common = {};
window.common.A = {};
window.common.A.str = 'A';
window.common.B = {};
window.common.B.str = 'B';
生成命名空间是个很常用的功能,可以将其封装成一个函数:
var common = {};
common.namesapce = function (str) {
var obj = common;
var arr = str.split('.');
var initIndex = arr[0] === 'common' ? 1 : 0;
for (var i = initIndex; i < arr.length; i++) {
obj[arr[i]] = {};
obj = obj[arr[i]];
}
};
common.namesapce('common.A.str');
common.namesapce('common.B');
console.log(common);
总结:匿名函数、全局变量、命名空间结合才能更好的解决命名冲突。
二、引入第三方库命名冲突
依赖第三方库的实现,入jquery提供了解决冲突的方法
var jq = jQuery.noconflict();
附jq noconflict方法的实现
(function (window, undefined) {
var
_jQuery = window.jQuery,
// Map over the $ in case of overwrite
_$ = window.$,
jQuery.extend({
noConflict: function (deep) {
if (window.$ === jQuery) {
window.$ = _$;
}
if (deep && window.jQuery === jQuery) {
window.jQuery = _jQuery;
}
return jQuery;
}
})
}(window))













网友评论