jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理

jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理

最近在看jquery源码分析的视频教学,希望将视频中学到的知识用博客记录下来,更希望对有同样对jquery源码有困惑的童鞋能有一点点的帮助(我是从一个小白的角度出发,感觉挺容易理解的,顺带说下视频中jquery源码选取的是2.0.3版本)。

 

我们都知道,使用$和jQuery效果是一样的,比如:

1 <button id="btn">点我</button>
2 $("#btn").click(function(e) {
3     console.info(e.type);
4 });
5 jQuery("#btn").click(function(e) {
6     console.info(e.type);
7 });

为什么是这样子呢?因为jquery源码中是包在一个立即调用的函数表达式中(一个闭包),对外暴露的接口就是$和jQuery,将这两个属性绑定在window下:

1 window.jQuery = window.$ = jQuery;

因为别的库也用$或者jQuery符号,比如prototype.js,所以同时引prototype和jquery就有可能造成命名冲突,jquery解决命名冲突问题的代码如下:

 1 (function(window, undefined) 
 2         
 3     
 4     var
 5     // Map over jQuery in case of overwrite
 6         _jQuery = window.jQuery,
 7 
 8     // Map over the $ in case of overwrite
 9         _$ = window.$;
10 
11     jQuery.noConflict = function( deep ) {
12         if ( window.$ === jQuery ) {
13             window.$ = _$;
14         }
15 
16         if ( deep && window.jQuery === jQuery ) {
17             window.jQuery = _jQuery;
18         }
19 
20         return jQuery;
21     };
22 })(window);

noConflict是jquery通过extend扩展的工具方法(静态方法),与ajax方法一样,调用方法为$.noConflict()或者jQuery.noConflict(),不带参数是对$的处理,带参数true时是对jQuery的处理,这个函数返回值就是jQuery对象。jquery源码中用_jQuery和_$来保存全局中jQuery和$的值,因为jquery对外接口的时候将$和jQuery全部挂在window上,window.$和jQuery始终是相等的,都等于jquery源码中的jQuery对象,所以jquery会放弃对$的使用(我不用$了,你们用吧),将_$中保存的值赋给window.$;如果加一个参数true的时候,jquery会放弃jQueryde的使用,将_jQuery中保存的值赋给window.jQuery(2种情况都会返回jQuery对象,我们还是可以用继续用$来用别的库的方法,并且用另外的变量来保存返回的jQuery对象来使用jquery的方法。

 1 <script>
 2     var  $  = {
 3         sayName: function() {
 4             console.info('我是prototype中的$');
 5         }
 6     };
 7 </script>  
 8 <script src="jquery.2.0.3.js"></script>    
 9 <script>
10     var iAmRealJQ = $.noConflict();
11     $.sayName(); // 我们还可以使用自定的$对象的方法
12     console.info(iAmRealJQ);  // 我们还可以用jquery源码的jQuery对象来实例化一个新对象 -->
13 </script>
 1 <script>
 2     var  jQuery  = {
 3         sayName: function() {
 4             console.info('我是某个库中的jQuery');
 5         }
 6     };
 7 </script>
 8 <script src="jquery.2.0.3.js"></script>
 9 <script>
10     var iAmRealJQ = jQuery.noConflict(true);
11     jQuery.sayName(); // 我们还可以使用自定的jQuery对象的方法
12     console.info(iAmRealJQ);  // 我们还可以用jquery源码的jQuery对象来实例化一个新对象 
13 </script>

 

转载于:https://www.cnblogs.com/hanshuai/p/6766202.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机java软件_浅谈软件开发就业前景

​  我国信息化人才培养还处于发展阶段&#xff0c;导致社会实际需求人才基数远远大于信息化人才的培养基数&#xff0c;使得数以万计的中小企业急需全面系统掌握软件开发基础技能与知识的软件工程师。目前对软件已达20万并且以每年20%左右的速度增长。在未来5年内合格软件人…

单链表的应用(电话本)

单链表 单链表的定义就不说了, 很简单, 请自行百度; 那么从今天的主题<单链表的应用>入手; 利用单链表实现电话本的模拟程序&#xff1a;定义单链表的数据类型&#xff0c;将头插法和尾插法、插入、逆置、删除、查找、修改、计数、输出等操作都定义成子函数的形式&#…

有意思的BAT CMD if while循环 整型自增

引言 我们开发过程中经常遇到写bat进行测试的&#xff0c;需要对这方面有些基础&#xff0c;我给出个示例&#xff0c;也方便自己以后工作做参考。 echo off title qifa :looprem setlocal enabledelayedexpansionset /a a1 echo loop %a%choice /t 1 /d y /n >nulrem 判断…

ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)...

ufldl学习笔记与编程作业&#xff1a;Multi-Layer Neural Network(多层神经网络识别手写体编程) ufldl出了新教程&#xff0c;感觉比之前的好&#xff0c;从基础讲起&#xff0c;系统清晰&#xff0c;又有编程实践。 在deep learning高质量群里面听一些前辈说&#xff0c;不必深…

sql查询无结果返回空_3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错...

引言Laravel 提供了 Eloquent ORM 对象用于操作数据库&#xff0c;将其进行抽象方便操作。因为设计的灵活度&#xff0c;大家在使用Model查询数据集的时候&#xff0c;会面临结果为空&#xff0c;记录不存在的问题&#xff0c; 那么如何有效地判断查询记录为空呢&#xff1f;本…

Android 7.1 bootchart触发后导致不断重启

android7.1 bootchart android 7.1的bootchart问题比较多&#xff0c;之前的版本还是比较稳定的&#xff0c;但是7.1之后出现了问题。 由於7.0 bootchart.cpp中有bug, google在7.1上還沒有修复&#xff0c;当我们执行下面的命令后 adb shell echo 120 > /data/bootchart/st…

深度优先搜索小结

深度优先搜索(DFS) 深度优先搜索就好比走迷宫, 不断顺着一条路走, 直到走不通为止, 然后回退到上一个路口再向另外的方向行走(走过的方向就不会再走了,又不是傻子, 知道走不通,还向走不通的方向走), 不断重复(试过所有路口, 状态转移), 重复直到找到唯一的一条合适的路径; DFS…

python 串口_如何使用Python开发串口通讯上位机(一)

用Python开发串口通讯型上位机&#xff0c;其实并非最优解&#xff0c;本系列更新只为个人学习与总结。如果有C语言底子&#xff0c;嵌入式层面的上位机开发&#xff0c;C Builder&#xff0c;C#才是更加好用的利器。1什么是上位机从事过嵌入式软件开发或者工控机开发的&#x…

[RK3399 Android7.1] 开启保存上一次重启前日志

保存上一次重启前日志的必要 分析死机的情况需要我们把上一次不能及时抓取的日志拿到是非常关键的&#xff0c;这个方法非常有利于我们分析内核panic和Android 死机的情况。 开启的方法 内核配置 在dts文件里面添加下面两个节点 ramoops_mem: ramoops_mem { reg <0x0 …

算法题之求二叉树的最大距离

二叉树是一种非常经典的数据结构。如果我们把二叉树看成一个图&#xff0c;父子节点之间的连线看成是双向的&#xff0c;我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。 下面我们随意构造出一棵二叉树&#xff0c…

MySQL基本操作指令

MySQL 注: MySQL对大小写不敏感, 需要对大小检索, 使用关键字binary, "[]"中内容为可选内容; table_name, tableName表示表名, columnName表示列名, DataType表示表中列数据类型, 粗体部分表示关键字 创建数据库: create database [if not exits] 数据库名;删除数据…

php 公众号验证回调方法_微信公众号关键词自动回复设置方法!

什么是公众号关键词自动回复&#xff1f;在微信公众号平台设置关键词自动回复&#xff0c;可以通过添加规则&#xff0c;关注/订阅的用户发送的消息内容如果是你设置的关键字&#xff0c;即可以实现自动回复预先设置好的内容。关键字自动回复设置方法&#xff1a;1、 首先我们进…

图文|Android 使用Thread 和多线程使用互斥锁

为什么需要多线程进行开发&#xff1f;多线程不管是嵌入式系统RTOS&#xff0c;Linux&#xff0c;还是应用开发&#xff0c;中间件开发&#xff0c;都是必不可少的&#xff0c;做一个技术的时候&#xff0c;如果能做到举一反三&#xff0c;下次使用的时候不会再遇到坑&#xff…

01.轮播图之三 : collectionView 轮播

个人觉得 collection view 做轮播是最方便的&#xff0c;设置下flowlayout 其他不会有很大的变动&#xff0c;没有什么逻辑的代码 lets begin…… 创建自定义的view .h 声明文件 interface CollectionViewShuffling : UIViewproperty (nonatomic,strong)NSArray *array;end .m …

JDBC入门级操作

JDBC:数据库连接, 通过接口实现不同数据库之间的切换, 面向接口编程 JDBC驱动程序将JDBC调用映射成特定的数据库调用 驱动类型: 1.JDBC驱动:JDBC-ODBC桥,最早的实现方式,将JDBC API映射到ODBC API,Java8中已删除 2.直接将JDBC API映射成数据库特定的客户端API,次驱动包含特定数…

手机调试python的软件_Appium+Python(ios真机移动端App H5混合自动化实战测试)

一、环境搭建篇(一)安装JDK大家自行安装(二)安装Appium1、appium desktop2、appium server> brew install node # get node.js> npm install -g appium # get appium> npm install wd # get appium client> appium & # start appium> node your-appium-test…

计算机专业的学生该选择日后的人生道路?继续从事IT还是考公务员……

问题来自知乎原问题如下&#xff1a;知乎上的盆友们大家好&#xff01;我是某高校大二学生。万能的知友们&#xff0c;有相关经验的大家给点宝贵意见呗&#xff0c;万分感谢。个人问题&#xff1a;我当时是听说这一行工资高&#xff0c;因为家里条件一般&#xff0c;所以想要挣…

file_put_contents()写入数组

file_put_contents()写入数组 $arr array(name>张三&#xff0c;‘age’>26, sex>男 ) $str var_export($arr,TRUE); file_put_contents($filename,$str);转载于:https://www.cnblogs.com/icefei/p/6773916.html

JVM垃圾收集器与内存分配策略学习总结

方法区: 1.线程共享 2.储存类信息,常量,静态变量,编译器编译后的代码 3.非堆(别名)用于区分Java堆 4.不需要连续的内存 5.可以固定或可扩张 6.选择不实现垃圾回收//这个区域很少进行垃圾回收 7.针对常量池回收 8.对类型的卸载 9.无法满足内存分配需求抛出OutOfMemoryError4 虚…

汇编比较两个数大小_计算机是怎样跑起来的 -- 体验一次汇编过程

标志内存或I/O中存储单元的数字叫做“地址”。CPU中的标志寄存器有什么作用&#xff1f;用于在运算指令执行后&#xff0c;存储运算结果的某些状态。从程序员的角度看硬件CPU&#xff1a;种类&#xff0c;时钟信号的频率。可以使用哪种机器语言取决于CPU的种类。内存信息&#…