美文网首页
2020-09-03 js避免命名冲突

2020-09-03 js避免命名冲突

作者: 欣欣最棒 | 来源:发表于2020-09-03 14:49 被阅读0次

在js模块化以前,工作过程中可能会遇到如下两种命名冲突的情况:

  1. 多人合作命名冲突
  2. 引入第三方库命名冲突

一、多人合作命名冲突

场景一、项目中有公共工具方法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))

相关文章

  • 2020-09-03 js避免命名冲突

    在js模块化以前,工作过程中可能会遇到如下两种命名冲突的情况: 多人合作命名冲突 引入第三方库命名冲突 一、多人合...

  • TypeScript的命名空间

    在JS中为了避免命名冲突问题,会将变量声明放在函数作用域里来避免变量冲突问题,如下例: 1、命名空间的定义 在Ty...

  • 避免JS冲突、js命名空间

    1)如何避免JS冲突 A:匿名函数 在多人合作一个网站时,每个人都会写自己的JS代码,定义变量的时候有可能会引起命...

  • 避免JS冲突、JS命名空间

    如何避免JS冲突 A:匿名函数在多人合作一个网站时,每个人都会写自己的JS代码,定义变量的时候有可能会引起命名冲突...

  • 《Effective Objective-C 2.0 》 阅读笔

    第15条:用前缀避免命名空间冲突 命名冲突 由于Objective-C没有命名空间机制,所以如果发生命名冲突,那么...

  • iOS --用前缀避免命名空间冲突 (10)

    用前缀避免命名空间冲突 OC 没有其他语言那种内置的命名空间机制, 鉴于此, 我们在其名时要设法避免潜在的命名冲突...

  • js 模块

    模块的来源 最早的模块机制出现在node,即common js, 因为后端开发比较的复杂,为了避免命名重复产生冲突...

  • Effective Objective-C 2.0 总结(三)

    接口与 API 设计 第 15 条:用前缀避免命名空间冲突 如果发生命名冲突(naming clash),那么应用...

  • 第三章 接口与API设计(EffectiveObjective-

    1 使用前缀避免命名空间冲突 命名冲突,应用程序链接的时候会报错duplicate symbol _OBJC_ME...

  • js常用编程模式

    1.命名空间 js中存在命名空间概念,为了减少命名冲突。但js中没有命名空间关键字。js实现思路,定义一个全局变量...

网友评论

      本文标题:2020-09-03 js避免命名冲突

      本文链接:https://www.haomeiwen.com/subject/ettosktx.html