资讯专栏INFORMATION COLUMN

jQuery源码分析之noConflict()

Yuanf / 906人阅读

摘要:将或者的控制权让给第一个实现它的那个库,确保不会与其它库的对象发生冲突。

noConflict()

noConflict()将$或者jQuery的控制权让给第一个实现它的那个库,确保jQuery不会与其它库的$对象发生冲突。

jQuery中源码如下:

var _jQuery = window.jQuery,
    _$ = window.$;
jQuery.noConflict = function(deep){
    if(window.$ === jQuery){
        window.$ = _$;
    }
    if(deep && window.jQuery === jQuery){
    window.jQuery = _jQuery;
    }
};
分析源码之前,我们应该注意几个点:

jQuery文件应该在其它冲突库文件之后导入;noConflict()必须在你导入jQuery文件之后使用;

导致冲突的库中必须已经存在一个$或者jQuery的命名空间,否则_jQuery = window.jQuery_$ = window.$就没有意义了

下面开始分析源码:

假如我们引入了两个库,prototype.js和jQuery.js。prototype.js在前,jQuery.js在后,并且prototype.js中存在一个$的命名空间

//这句代码其实是在jQuery文件最开始的地方定义的,目的是保存prototype.js文件中的$或者jQuery命名空间
var _jQuery = window.jQuery,_$ = window.$;
jQuery.noConflict = function(deep){
//这里判断如果当前的window.$已经被jQuery占用了,就把之前保存的prototype.js中的$的变量_$赋值给window.$进行覆盖
    if(window.$ === jQuery){
        window.$ = _$;
    }
    //这里判断如果deep为true并且当前的window.jQuery也已经被jQuery占用了,就把之前保存的prototype.js中的jQuery的变量_jQuery赋值给window.jQuery进行覆盖
    if(deep && window.jQuery === jQuery){
    window.jQuery = _jQuery;
    }
};
分析完上面的源码之后,这里有几个点要思考一下:

为什么调用noConflict()之后我们发现window.$已经等于jQuery了?

在jQuery代码最后有一段代码可以解释这个问题:

if ( typeof window === "object" && typeof window.document === "object" ) {
    window.jQuery = window.$ = jQuery;
}

如果prototype.js中没有冲突的命名空间,那调用noConflict()会怎么样么?

如果之前没有冲突的命名空间,那_&_jQuery都是undefined,所以window.$window.jQuery都会被undefined覆盖;也就是说,只要调用了noConflict(),jQuery就会交出$或者jQuery的控制权,无论之前有没有命名空间冲突

参考资料:
http://www.imooc.com/learn/172

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82439.html

相关文章

  • underscore源码剖析整体架构

    摘要:我这里有个不够准确但容易理解的说法,就是检查一个对象是否为另一个构造函数的实例,为了更容易理解,下面将全部以是的实例的方式来说。 underscore源码分析之整体架构 最近打算好好看看underscore源码,一个是因为自己确实水平不够,另一个是underscore源码比较简单,比较易读。本系列打算对underscore1.8.3中关键函数源码进行分析,希望做到最详细的源码分析。今...

    2shou 评论0 收藏0
  • 学习 underscore 源码整体架构,打造属于自己的函数式编程类库

    摘要:译立即执行函数表达式处理支持浏览器环境微信小程序。学习整体架构,利于打造属于自己的函数式编程类库。下一篇文章可能是学习的源码整体架构。也可以加微信,注明来源,拉您进前端视野交流群。 前言 上一篇文章写了jQuery整体架构,学习 jQuery 源码整体架构,打造属于自己的 js 类库 虽然看过挺多underscore.js分析类的文章,但总感觉少点什么。这也许就是纸上得来终觉浅,绝知此...

    junnplus 评论0 收藏0
  • FE.SRC-逐行分析jQuery2.0.3源码-完整笔记

    摘要:根据项目选型决定是否开启。为了压缩,可维护为了支持从而使用代替变量存储防冲突会用到,形如版本号声明最终调用的是这个原型实际上。功能检测统一兼容性问题。 概览 (function (){ (21 , 94) 定义了一些变量和函数 jQuery=function(); (96 , 293) 给jQuery对象添加一些方法和属性; (285 , 347) ...

    Lin_R 评论0 收藏0
  • FE.SRC-逐行分析jQuery2.0.3源码-完整笔记

    摘要:根据项目选型决定是否开启。为了压缩,可维护为了支持从而使用代替变量存储防冲突会用到,形如版本号声明最终调用的是这个原型实际上。功能检测统一兼容性问题。 概览 (function (){ (21 , 94) 定义了一些变量和函数 jQuery=function(); (96 , 293) 给jQuery对象添加一些方法和属性; (285 , 347) ...

    褰辩话 评论0 收藏0
  • jQuery.noConflict方法解析

    摘要:功能文档中对方法的描述是释放对变量的控制权。不是很明确,慢慢解释下。类似的手法方法也实现了对变量的释放控制主要用于同时引入多个版本的。这里只对全局变量的处理进行解析,变量的处理方式类似。所以其他占用全局变量的库要先于引用,方法才能正确工作。 功能 jQuery API文档中对noConflict方法的描述是:释放jQuery对变量$的控制权。( ′◔ ‸◔`)不是很明确,慢慢解释下。我...

    RobinTang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<