noConflict()将$
或者jQuery
的控制权让给第一个实现它的那个库,确保jQuery
不会与其它库的$对象发生冲突。
jQuery中源码以下:prototype
var _jQuery = window.jQuery, _$ = window.$; jQuery.noConflict = function(deep){ if(window.$ === jQuery){ window.$ = _$; } if(deep && window.jQuery === jQuery){ window.jQuery = _jQuery; } };
_jQuery = window.jQuery
和_$ = window.$
就没有意义了下面开始分析源码:code
假如咱们引入了两个库,prototype.js和jQuery.js。prototype.js在前,jQuery.js在后,而且prototype.js中存在一个$的命名空间对象
//这句代码实际上是在jQuery文件最开始的地方定义的,目的是保存prototype.js文件中的$或者jQuery命名空间 var _jQuery = window.jQuery,_$ = window.$; jQuery.noConflict = function(deep){ //这里判断若是当前的window.$已经被jQuery占用了,就把以前保存的prototype.js中的$的变量_$赋值给window.$进行覆盖 if(window.$ === jQuery){ window.$ = _$; } //这里判断若是deep为true而且当前的window.jQuery也已经被jQuery占用了,就把以前保存的prototype.js中的jQuery的变量_jQuery赋值给window.jQuery进行覆盖 if(deep && window.jQuery === jQuery){ window.jQuery = _jQuery; } };
为何调用noConflict()以后咱们发现window.$已经等于jQuery了?get
在jQuery代码最后有一段代码能够解释这个问题:
if ( typeof window === "object" && typeof window.document === "object" ) { window.jQuery = window.$ = jQuery; }
若是prototype.js中没有冲突的命名空间,那调用noConflict()会怎么样么?源码
若是以前没有冲突的命名空间,那_&
和_jQuery
都是undefined,因此window.$
和window.jQuery
都会被undefined覆盖;也就是说,只要调用了noConflict(),jQuery就会交出$
或者jQuery
的控制权,不管以前有没有命名空间冲突