JQuery源码解析-JQuery的工具方法(1)

在jQuery内部,所有的工具方法都是通过extend方法继承到jQuery中的。

产生jQuery的随机数

// Unique for each copy of jQuery on the page
    expando: "jQuery" + ( core_version + Math.random() ).replace( /D/g, "" ),

可以看到expando这个属性每次进行访问都是不同的值,在jQuery内部,有时会需要一个唯一的随机串来进行区分,例如缓存方法,ajax方法等。

noConflict方法

这个方法主要是用来防止冲突,有时在页面中可能引入了多种框架,那就无法避免在其他框架中对$符号的占用,所以这个方法就起到了作用。

如:

   var $ = "aaa";
   $(function () { })

这样运行之后,页面中一定会报错,因为$符号被重新赋值了,这时候就要用noConflict方法来解决这个问题

     var jQ = $.noConflict();
        var $ = "aaa";
        jQ(function () {
            alert(1);
        })

这个方法内部重新返回一个jQuery的对象,一会看源码的时候就可以看到

除了这种情况还有一种情况,那就是将$符号在引用jQuery库之前进行赋值,那在引用jQuery库的时候,$符号就会被重新进行赋值,所以$符号的值正常来说就已经丢失了,好在jQuery已经对这种情况进行了处理:

<script>
        var $ = "aaa";
</script>
 <script src="jquery-2.0.3.js"></script>
<script>
        var jQ = $.noConflict();
        jQ(function () {
            alert($);
        })

    </script>

运行可以看到$符号的值"aaa"是可以被弹出的。

这个方法还有一个参数,这个参数是一个bool值,如果传入的值为true的话,就代表对jQuery进行弃用,例如:

 <script>
        var jQuery = "aaa";
    </script>

    <script src="jquery-2.0.3.js"></script>

    <script>
        var jQ = $.noConflict();
        jQ(function () {
            alert(jQuery);
        })

    </script>

运行结果是弹出jQuery对象,并没有弹出aaa,所以这个时候如果传入true

  var jQ = $.noConflict(true);

这个时候就可以将aaa正常弹出了。

下面来看一下源码,源码非常简单:

noConflict: function( deep ) {
        if ( window.$ === jQuery ) {
            window.$ = _$;
        }

        if ( deep && window.jQuery === jQuery ) {
            window.jQuery = _jQuery;
        }

        return jQuery;
    },

首先判断挂载到window上的$符号是否和jQuery相等,如果一致,则将_$符号重新对window上的$符进行覆盖,前面说过,在源码的38 和41行分别对这两个变量进行赋值。

第二个条件,如果传入的为true,则将_jQuery覆盖到window上的jQuery对象。

最好放jQuery对象,也就是:

 var jQ = $.noConflict(true);

这句话,其实不管var定义的什么,其实都是jQuery对象。

原文地址:https://www.cnblogs.com/y8932809/p/5867305.html