jQuery.noConflict 方法包含一个可选的布尔参数[1],用以决定移交 $ 引用的同时是否移交 jQuery 对象自己: jquery
jQuery.noConflict([removeAll])缺省状况下,执行 noConflict 会将变量 $ 的控制权移交给第一个产生 $ 的库;当 removeAll 设置为 true 时,执行 noConflict 则会将 $ 和 jQuery 对象自己的控制权所有移交给第一个产生他们的库。
// Map over jQuery in case of overwrite _jQuery = window.jQuery, // Map over the $ in case of overwrite _$ = window.$,容易理解的是,jQuery 经过两个私有变量映射了 window 环境下的 jQuery 和 $ 两个对象,以防止变量被强行覆盖。一旦 noConflict 方法被调用,则经过 _jQuery, _$, jQuery, $ 四者之间的差别,来决定控制权的移交方式,具体的代码以下:
noConflict: function( deep ) { if ( window.$ === jQuery ) { window.$ = _$; } if ( deep && window.jQuery === jQuery ) { window.jQuery = _jQuery; } return jQuery; }再来看上面所说的参数设定问题,若是 deep 没有设置,_$ 覆盖 window.$,此时 jQuery 别名 $ 失效,但 jQuery 自己完整无缺。若是有其余类库或代码从新定义了 $ 变量,它的控制权就彻底交接出去了。反之若是 deep 设置为 true 的话,_jQuery 覆盖 window.jQuery,此时 $ 和 jQuery 都将失效。
var query = jQuery.noConflict(true); (function ($) { // 插件或其余形式的代码,也能够将参数设为 jQuery })(query);[1] http://api.jquery.com/jQuery.noConflict/#jQuery-noConflict-removeAll