在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对象。