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之可拖动的iframe效果代码
Aug 01 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
Apr 01 Javascript
浅析js封装和作用域
Jul 09 Javascript
js预加载图片方法汇总
Jun 15 Javascript
你不知道的高性能JAVASCRIPT
Jan 18 Javascript
jQuery原理系列-css选择器的简单实现
Jun 07 Javascript
Javascript(es2016) import和require用法和区别详解
Aug 11 Javascript
mongodb初始化并使用node.js实现mongodb操作封装方法
Apr 02 Javascript
vue elementUI table 自定义表头和行合并的实例代码
May 22 Javascript
Element Dialog对话框的使用示例
Jul 26 Javascript
js实现移动端轮播图滑动切换
Dec 21 Javascript
详解实现vue的数据响应式原理
Jan 20 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
PHP中的string类型使用说明
2010/07/27 PHP
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
DOM相关内容速查手册
2007/02/07 Javascript
用正则获取指定路径文件的名称
2007/02/27 Javascript
Jquery中给animation加更多的运作效果实例
2013/09/05 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
JS触发服务器控件的单击事件(详解)
2016/08/06 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
js+css实现打字效果
2020/06/24 Javascript
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
在Python程序中实现分布式进程的教程
2015/04/28 Python
Python爬虫爬验证码实现功能详解
2016/04/14 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
Molly Bracken法国电子商店:法国女性时尚品牌
2019/07/24 全球购物
俄罗斯极限运动网上商店:Board Shop №1
2020/12/18 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
医院学雷锋活动策划方案
2014/02/15 职场文书
报纸媒体创意广告词
2014/03/17 职场文书
高一新生军训方案
2014/05/12 职场文书
物理学专业求职信
2014/07/04 职场文书
小学综合实践活动总结
2014/07/07 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
煤矿安全保证书
2015/02/27 职场文书
小学感恩主题班会
2015/08/12 职场文书
创业计划书详解
2019/07/19 职场文书