js避免命名冲突

tech2022-12-09  117

在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))
最新回复(0)