如何避免JavaScript命名空间冲突?

3

我有一个企业应用程序,导入了一些JavaScript库(假设为A),其中包含全局命名空间中的一些函数。

我们的客户可以扩展我们的平台并导入jQuery,这将导致命名空间冲突。

为了帮助客户避免命名空间冲突,最好的方法是什么?由于jQuery非常流行,每个客户都会使用它。

我该如何更改库A的命名空间?最方便和最安全的方法是什么?

5个回答

3

对于jQuery,最简单的方法是使用jQuery.noConflict()来获取一个新的选择器变量,而不是使用$。

var j$ = jQuery.noConflict();

j$('#test-id')

2

您应该构建一个界面,使客户无法影响全局空间。

将客户的代码包装在其自己的函数中。

(function () {
  var window, global;  // Keep these private to this function
  // Customer code here
])();

你需要为他们提供一个接口来访问你的函数,但如何实现取决于你的应用程序,所以我不能提供示例。这可能只是简单地传递一个参数,该参数可以访问包含客户代码需要操作的内容的对象。

现在,这并不适用于所有情况。显然,你大大限制了他们的代码所能访问的内容。你需要自己提供对该功能的访问权限。


在匿名函数中声明window和global有什么意义?局部作用域不仍然能够看到全局属性,如window等吗? - Sledge

2
请使用以下结构:
(function ($, a, b) {
   // ... place your code here   
})(jQuery, myLibraryA, otherLibraryB);

所谓“匿名函数”,它创建了一个本地作用域(所有在其中声明的变量和函数都将是本地的,不会干扰其他代码)。它导入了三个库:jQuery、myLiberayA 和 otherLibraryB,在本地作用域中,它们可以通过 $、a 和 b 这些名称进行访问。


要查看如何使用不同版本的jQuery,请参考此文章 - Aurovrata

1

如果您想使用第三方JavaScript库的组合,也可以这样做:基本上为每个对象创建另一个命名空间;

if(window.jQuery && !(window.MyjQuery)){
  var window['MyjQuery'] =  window.jQuery;
  var j$ = window['MyjQuery']; //alias

  j$(document).ready(function(){
    //code goes here...
  });

}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接