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 相关文章推荐
JavaScript 对象的属性和方法4种不同的类型
Mar 19 Javascript
js data日期初始化的5种方法
Dec 29 Javascript
JavaScript随机生成信用卡卡号的方法
Apr 07 Javascript
深入理解node exports和module.exports区别
Jun 01 Javascript
jQuery实现日期联动效果实例
Jul 26 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
Aug 07 Javascript
jquery插件开发之选项卡制作详解
Aug 30 jQuery
JavaScript数组去重算法实例小结
May 07 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
Jun 05 Javascript
js实现同一个页面,多个enter事件绑定的示例
Oct 10 Javascript
微信小程序获取用户绑定手机号方法示例
Jul 21 Javascript
JavaScript运动原理基础知识详解
Apr 02 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
Mysql中分页查询的两个解决方法比较
2013/05/02 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
AngularJS入门教程之数据绑定原理详解
2016/11/02 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
2016/12/08 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
图解javascript作用域链
2019/05/27 Javascript
vue实现公共方法抽离
2020/07/31 Javascript
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
python fabric实现远程操作和部署示例
2014/03/25 Python
python发送HTTP请求的方法小结
2015/07/08 Python
Python实现多并发访问网站功能示例
2017/06/19 Python
python逆向入门教程
2018/01/15 Python
python如何为创建大量实例节省内存
2018/03/20 Python
Python 实现使用dict 创建二维数据、DataFrame
2018/04/13 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
python+numpy+matplotalib实现梯度下降法
2018/08/31 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
python实现梯度下降算法的实例详解
2020/08/17 Python
三分钟自我介绍演讲稿
2014/08/21 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
农村文化建设标语
2014/10/07 职场文书
先进单位申报材料
2014/12/25 职场文书
幼儿园感谢信
2015/01/21 职场文书
老乡聚会通知
2015/04/23 职场文书
2016年中秋节晚会领导致辞
2015/11/26 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js
Docker官方工具docker-registry案例演示
2022/04/13 Servers
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers