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基础整理1
Dec 06 Javascript
javascript设计模式 接口介绍
Jul 24 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
Aug 14 Javascript
jQuery入门基础知识学习指南
Aug 14 Javascript
jQuery 1.9.1源码分析系列(十)事件系统之绑定事件
Nov 19 Javascript
详解Angular2中的编程对象Observable
Sep 17 Javascript
Angular.js实现注册系统的实例详解
Dec 18 Javascript
jQuery实现CheckBox全选、全不选功能
Jan 11 Javascript
gulp解决跨域的配置文件问题
Jun 08 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
May 21 jQuery
在layui框架中select下拉框监听更改事件的例子
Sep 20 Javascript
优雅的使用javascript递归画一棵结构树示例代码
Sep 22 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
PHP4实际应用经验篇(9)
2006/10/09 PHP
php将数组存储为文本文件方法汇总
2015/10/28 PHP
linux下为php添加iconv模块的方法
2016/02/28 PHP
通过js获取div的background-image属性
2013/10/15 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
JavaScript+html5 canvas实现图片破碎重组动画特效
2016/02/22 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
Asp.Net之JS生成分页条的方法
2016/11/23 Javascript
JS使用正则实现去掉字符串左右空格的方法
2016/12/27 Javascript
js实现三级联动效果(简单易懂)
2017/03/27 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
JavaScript实现alert弹框效果
2020/11/19 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
wxpython 学习笔记 第一天
2009/03/16 Python
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
python通过正则查找微博@(at)用户的方法
2015/03/13 Python
用Python创建声明性迷你语言的教程
2015/04/13 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
python操作列表的函数使用代码详解
2017/12/28 Python
基于Python中求和函数sum的用法详解
2018/06/28 Python
Python实现识别图片内容的方法分析
2018/07/11 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
Python实现微信机器人的方法
2019/09/06 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
英国最大的在线时尚眼镜店:Eyewearbrands
2019/03/12 全球购物
销售代理协议书
2014/09/30 职场文书
2014年营业员工作总结
2014/11/18 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
MySQL分库分表详情
2021/09/25 MySQL