jQuery源码分析之noConflict()

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值