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实现tabs选项卡切换效果(扩展版)
Mar 19 Javascript
jQuery操作cookie方法实例教程
Nov 25 Javascript
js实现大转盘抽奖游戏实例
Jun 24 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
Jan 15 Javascript
JS实现iframe编辑器光标位置插入内容的方法(兼容IE和Firefox)
Jun 24 Javascript
使用JQuery选择HTML遍历函数的方法
Sep 17 Javascript
jQuery的extend方法【三种】
Dec 14 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
Sep 07 Javascript
基于Vue过渡状态实例讲解
Sep 14 Javascript
Bootstrap实现翻页效果
Nov 27 Javascript
js滚轮事件 js自定义滚动条的实现
Jan 18 Javascript
支付宝小程序实现省市区三级联动
Jun 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
isset和empty的区别
2007/01/15 PHP
PHP 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
解析PHP中常见的mongodb查询操作
2013/06/20 PHP
PHP 二维数组根据某个字段排序的具体实现
2014/06/03 PHP
Laravel中如何增加自定义全局函数详解
2017/05/09 PHP
js验证上传图片的方法
2015/05/12 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
pc加载更多功能和移动端下拉刷新加载数据
2016/11/07 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
vue移动端项目缓存问题实践记录
2018/10/29 Javascript
JS学习笔记之数组去重实现方法小结
2019/05/29 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
Python批处理删除和重命名文件夹的实例
2018/07/11 Python
Python通过调用有道翻译api实现翻译功能示例
2018/07/19 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
基于Python函数和变量名解析
2019/07/19 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
Python异常继承关系和自定义异常实现代码实例
2020/02/20 Python
Python线程协作threading.Condition实现过程解析
2020/03/12 Python
Python descriptor(描述符)的实现
2020/11/15 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
你的自行车健身专家:FaFit24
2016/11/16 全球购物
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
工厂门卫岗位职责
2013/11/25 职场文书
入党自荐书范文
2015/03/05 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
python爬虫框架feapde的使用简介
2021/04/20 Python
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
openstack云计算keystone组件工作介绍
2022/04/20 Servers
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL