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获取一组checkbox的值(实例代码)
Nov 04 Javascript
js中的setInterval和setTimeout使用实例
May 09 Javascript
jQuery层级选择器实例代码
Feb 06 Javascript
bootstrap table 数据表格行内修改的实现代码
Feb 13 Javascript
详解require.js配置路径的用法和css的引入
Sep 06 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
Aug 30 Javascript
JS函数节流和防抖之间的区分和实现详解
Jan 11 Javascript
elementUI select组件使用及注意事项详解
May 29 Javascript
小程序如何支持使用 async/await详解
Sep 12 Javascript
微信小程序 wxParse插件显示视频问题
Sep 27 Javascript
JS+CSS实现炫酷光感效果
Sep 05 Javascript
Vue获取微博授权URL代码实例
Nov 04 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
用PHP读取RSS feed的代码
2008/08/01 PHP
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
PHP新建类问题分析及解决思路
2015/11/19 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
基于ajax及jQuery实现局部刷新过程解析
2020/09/12 jQuery
从Python程序中访问Java类的简单示例
2015/04/20 Python
python3调用R的示例代码
2018/02/23 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
python+mysql实现教务管理系统
2019/02/20 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
python如何判断IP地址合法性
2020/04/05 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
华为消费者德国官方网站:HUAWEI德国
2020/11/03 全球购物
中学生差生评语
2014/01/30 职场文书
2014年结对帮扶工作总结
2014/12/17 职场文书
撤诉书怎么写
2015/05/19 职场文书
军训决心书范文
2015/09/22 职场文书
二年级数学教学反思
2016/02/16 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书