jQuery中noconflict函数的实现原理分解


Posted in Javascript onFebruary 03, 2015

jQuery中,noconflict是用来防止变量冲突,用来释放变量控制权的一个重要方法。我们知道,jQuery中对外提供有两个全局变量,$和jQuery,虽然jQuery只产生了两个全局变量,极少情况下才会出现冲突,但是如果网页中如果包涵较多的类库,有自定义$或jQuery全局变量的存在时,就产生冲突。

jQuery提供的noconflict函数很好的解决了变量冲突问题,无论是$或者jQuery冲突都可以解决,接下来我们就来分析一下jQuery的冲突处理。

先来看一下jQuery源码中noconflict的实现:

(function(window,undefined){
var 
// Map over jQuery in case of overwrite
_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)

在这里jQuery.extend是jQuery扩展静态属性的方法,这里可以看成直接在jQuery上附加noConflict方法。在匿名函数的内部,分别定义内部变量_jQuery和_$用来存储window.jQuery和window.$, 这么做的用作在于用内部变量保存jQuery运行之前这两个全局变量的状态, 以便在后面的防冲突操作中还原这两个变量。noConflict可处理$和jQuery这两个变量冲突的情况,默认处理$,传入一个true参数,则处理jQuery冲突的情况。
window.$ === jQuery用来判断全局变量是否等于jQuery,如果等于,则重新还原全局变量$为jQuery运行之前的变量(存储在内部变量 _$ 中);deep && window.jQuery === jQuery 当开启深度冲突处理并且全局变量jQuery等于内部jQuery,则把全局jQuery还原成之前的状况。判断window.$ === jQuery和window.jQuery=jQuery的意义在于保护已经定义的变量不被重写,如下面的代码:

//引入jQuery库
var $="String";
var jq=jQuery.noconflict();
var jQuery="This is a line";
var j=jq.noconflict(true);
console.log($);//这里如果没有window.$===jQuery这句判断,那么$将会等于undefined而不是"String"。
console.log(jQuery); //同上,如果没有判断window.jQuery===jQuery,重新定义的jQuery就会被undefined覆盖。

整个运行流程参加下图:

jQuery中noconflict函数的实现原理分解

noConflict返回的是jQuery库内部的jQuery构造函数, 像使用$一样尽情使用它吧!

Javascript 相关文章推荐
jQuery插件开发全解析
Oct 10 Javascript
jquery简单的拖动效果实现原理及示例
Jul 26 Javascript
js获取UserControl内容为拼html时提供方便
Nov 02 Javascript
javascript+html5实现绘制圆环的方法
Jul 28 Javascript
简单封装js的dom查询实例代码
Jul 08 Javascript
EditPlus中的正则表达式 实战(2)
Dec 15 Javascript
浅谈js中startsWith 函数不能在任何浏览器兼容的问题
Mar 01 Javascript
windows下更新npm和node的方法
Nov 30 Javascript
微信小程序仿朋友圈发布动态功能
Jul 15 Javascript
js 根据对象数组中的属性进行排序实现代码
Sep 12 Javascript
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
Mar 06 Javascript
uniapp实现横向滚动选择日期
Oct 21 Javascript
jQuery中的pushStack实现原理和应用实例
Feb 03 #Javascript
JavaScript闭包详解
Feb 02 #Javascript
js实现浏览器窗口大小被改变时触发事件的方法
Feb 02 #Javascript
javascript的switch用法注意事项分析
Feb 02 #Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 #Javascript
jQuery实现跟随鼠标运动图层效果的方法
Feb 02 #Javascript
JavaScript针对网页节点的增删改查用法实例
Feb 02 #Javascript
You might like
自己前几天写的无限分类类
2007/02/14 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
php指定函数参数默认值示例代码
2013/12/04 PHP
php递归删除目录与文件的方法
2015/01/30 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
JavaScript this调用规则说明
2010/03/08 Javascript
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
用Js实现的动态增加表格示例自己写的
2013/10/21 Javascript
javascript:void(0)的问题使用探讨
2014/04/10 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
jQuery页面加载初始化的3种方法(推荐)
2016/06/02 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
angular8和ngrx8结合使用的步骤介绍
2019/12/01 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
超简单使用Python换脸实例
2019/03/27 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
教学实习自我评价
2014/01/28 职场文书
农村葬礼主持词
2014/03/31 职场文书
职工小家建设活动方案
2014/08/25 职场文书
如何写好开幕词?
2019/06/24 职场文书
2019年度行政文员工作计划范本!
2019/07/04 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书