jQuery noConflict处理全局冲突时deep参数有什么作用
jQuery
noConflict 方法中 deep 参数的作用解析 首先明确结论:这个deep参数和深拷贝逻辑没有任何关联,它的作用是控制全局变量控制权移交的彻底程度。
先理清楚方法的前置逻辑:jQuery脚本加载时,会先把当前全局window对象上已存在的window.jQuery、window.$两个属性值缓存到内部私有变量_jQuery、_$中,之后才会把自身挂载到这两个全局属性上,这是整个冲突处理机制的基础。
两种调用模式的行为差异非常明确:
- 不传参调用
jQuery.noConflict()
仅会还原$全局变量:如果当前全局的$指向当前加载的jQuery实例,就把$的控制权交还给jQuery加载前占用该变量的原有值(也就是之前缓存的_$)。这种模式是最常用的场景,用来解决jQuery和其他同样占用$全局名的库(比如早期Prototype、Zepto)的冲突,调用后你可以用方法返回的jQuery实例自定义别名使用,比如var myJq = jQuery.noConflict(),后续通过myJq()调用方法即可,此时全局的jQuery变量仍然指向当前加载的jQuery。 - 传入真值(通常是
true)调用jQuery.noConflict(true)
除了还原$变量之外,还会额外还原jQuery全局变量:如果当前全局的jQuery指向当前加载的jQuery实例,就把jQuery的控制权也交还给jQuery加载前的原有值(缓存的_jQuery)。这种模式一般用在同页面加载多版本jQuery的场景:比如老项目基于jQuery 1.x开发,需要嵌入依赖jQuery 3.x的新模块时,新版本加载完成后调用该方法,可以把$和jQuery两个全局名完全还给之前加载的老版本,两个版本的运行上下文完全隔离,不会互相覆盖。
举个实际运行的例子:
<!-- 先加载1.6.4版本老jQuery --> <script src="jquery-1.6.4.js"></script> <script> console.log($.fn.jquery); // 输出 1.6.4 console.log(window.jQuery === $); // 输出 true </script> <!-- 再加载3.6.4版本新jQuery --> <script src="jquery-3.6.4.js"></script> <script> console.log($.fn.jquery); // 输出 3.6.4,全局变量已经被新版本覆盖 // 传入true移交所有全局控制权 var jq3 = jQuery.noConflict(true); console.log($.fn.jquery); // 输出 1.6.4,$控制权交还给老版本 console.log(window.jQuery.fn.jquery); // 输出 1.6.4,jQuery全局名也交还给老版本 console.log(jq3.fn.jquery); // 输出 3.6.4,新版本通过自定义别名jq3正常调用 </script>
之所以命名为deep,只是因为这种模式比默认模式做了更彻底的全局环境还原,和深浅拷贝场景下的deep参数语义完全无关,不要混淆。
内容的提问来源于stack exchange,提问作者chagatai
相关产品推荐
相关产品推荐

