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 相关文章推荐
一段非常简单的让图片自动切换js代码
Nov 10 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
Jan 08 Javascript
跟我学习javascript的浮点数精度
Nov 16 Javascript
jQuery滑动效果实现方法分析
Sep 05 jQuery
BootStrap modal实现拖拽功能
Dec 01 Javascript
简单通过settimeout看javascript的运行机制
May 10 Javascript
微信小程序封装多张图片上传api代码实例
Dec 30 Javascript
es6函数之严格模式用法实例分析
Mar 17 Javascript
如何使用vue slot创建一个模态框的实例代码
May 24 Javascript
快速解决element的autofocus失效问题
Sep 08 Javascript
Vue使用Proxy代理后仍无法生效的解决
Nov 13 Javascript
vue中h5端打开app(判断是安卓还是苹果)
Feb 26 Vue.js
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
sony ICF-2010 拆解与改装
2021/03/02 无线电
php简单的会话类代码
2011/08/08 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
PHP中文编码小技巧
2014/12/25 PHP
PHP中substr_count()函数获取子字符串出现次数的方法
2016/01/07 PHP
新闻内页-JS分页
2006/06/07 Javascript
关于Javascript 的 prototype问题。
2007/01/03 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
Vue全家桶实践项目总结(推荐)
2017/11/04 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
Python中的getopt函数使用详解
2015/07/28 Python
Python使用迭代器捕获Generator返回值的方法
2017/04/05 Python
python中的闭包函数
2018/02/09 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
基于Python3.7.1无法导入Numpy的解决方式
2020/03/09 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
django使用channels实现通信的示例
2020/10/19 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
HTML5 Convas APIs方法详解
2015/04/24 HTML / CSS
初一生物教学反思
2014/01/18 职场文书
十八大报告观后感
2014/01/28 职场文书
温馨提示标语
2014/06/26 职场文书
2014年连锁店圣诞节活动方案
2014/12/09 职场文书
2016年国培心得体会及反思
2016/01/13 职场文书
2016优秀员工先进事迹材料
2016/02/25 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js