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

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

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

 <button id="btn">点我</button>
$("#btn").click(function(e) {
console.info(e.type);
});
jQuery("#btn").click(function(e) {
console.info(e.type);
});

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

 window.jQuery = window.$ = jQuery;

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

 (function(window, undefined) 

     var
// Map over jQuery in case of overwrite
_jQuery = window.jQuery, // Map over the $ in case of overwrite
_$ = window.$; jQuery.noConflict = function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
} if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
} return jQuery;
};
})(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的方法。

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

jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理的更多相关文章

  1. Jquery源码中的Javascript基础知识(一)

    jquery源码中涉及了大量原生js中的知识和概念,文章是我在学习两者的过程中进行的整理和总结,有不对的地方欢迎大家指正. 本文使用的jq版本为2.0.3,附上压缩和未压缩版本地址: http://a ...

  2. jQuery源码中的“new jQuery.fn.init()”什么意思?

    所有文章搬运自我的个人主页:sheilasun.me 引子 最近打算试试看看jQuery的源码,刚开个头就卡住了.无论如何都理解不了jQuery源码入口部分中的 return new jQuery.f ...

  3. jQuery源码中的赌博网站

    前言 jQuery源码中有赌博网站? 起因是公司发的一份自查文件,某银行在日常安全运营过程中发现在部分jQuery源码中存在赌博和黄色网站链接. 链接分为好几个: www.cactussoft.cn ...

  4. jquery源码学习笔记三:jQuery工厂剖析

    jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...

  5. Jquery源码中的Javascript基础知识(三)

    这篇主要说一下在源码中jquery对象是怎样设计实现的,下面是相关代码的简化版本: (function( window, undefined ) { // code 定义变量 jQuery = fun ...

  6. Jquery源码中的Javascript基础知识(二)

    接上一篇,jquery源码的这种写法叫做匿名函数自执行 (function( window, undefined ) { // code })( window ); 函数定义了两个参数window和u ...

  7. 关于jQuery源码中(function(window,undefined){//dosomething()})(window)写法解释

    一.首先是最常见的闭包 (Closure) 范式自执行函数的写法,这里用匿名函数封装(构造块级作用域),避免了匿名函数内部的代码与外部之间发生冲突(如使用了相同的变量名). (function() { ...

  8. jquery源码学习(一)——jquery结构概述以及如何合适的暴露全局变量

    jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jq ...

  9. jQuery源码学习扒一扒jQuery对象初使化

    神奇的jQuery可以这样玩jQuery("#id").css()或 jQuery("#id").html() 这么玩jQuery("#id" ...

随机推荐

  1. Nginx在线服务状态下平滑升级及ab压力测试【转】

    今天,产品那边发来需求,说有个 APP 的 IOS 版本下载包需要新增 https 协议,在景安购买了免费的 SSL 证书.当我往 nginx 上新增 ssl 时,发现服务器上的 nginx 居然没编 ...

  2. Linux查看压缩文件内容【转】

    查看一个归档或者压缩文件的内容而无需解压它 得益于 Linux 社区,有很多命令行工具可以来达成上面的目标.下面就让我们来看看使用它们的一些示例. 1.使用 vim 编辑器 vim 不只是一个编辑器, ...

  3. python序列化模块的速度比较

    # -*- coding: utf-8 -*- # @Time : 2019-04-01 17:41 # @Author : cxa # @File : dictest.py # @Software: ...

  4. boost::tokenizer详解

    tokenizer 库提供预定义好的四个分词对象, 其中char_delimiters_separator已弃用. 其他如下: 1. char_separator char_separator有两个构 ...

  5. python操作mysql数据库增删改查的dbutils实例

    python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...

  6. C/C++ 获取文件大小

    在C语言中测试文件的大小,主要使用二个标准函数. 1.fseek 函数原型:int fseek ( FILE * stream, long int offset, int origin ); 参数说明 ...

  7. PYTHON深拷贝与浅拷贝

    浅拷贝就是对引用的拷贝,深拷贝就是对对象的资源的拷贝 浅拷贝 浅拷贝仅仅复制了容器中元素的地址 赋值的原则 1.赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ). 2.修改不可 ...

  8. List集合三种遍历方法

    List<String> list = new ArrayList<String>();list.add("aaa");list.add("bbb ...

  9. php 汉字首字母和全拼

    <?php/** *+------------------------------------------------------ * PHP 汉字转拼音 *+----------------- ...

  10. 机器学习之高斯混合模型及EM算法

    第一部分: 这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与k-means一样,给定的训练样本是,我们将隐含类 ...