上QQ阅读APP看书,第一时间看更新
1.6 无冲突处理
无冲突处理也叫多库共存。不得不说,$是最重要的函数名,这么多框架都爱用它做自己的命名空间。在jQuery还比较弱小时,如何让人们试用它呢?当时Prototype是主流,jQuery于是发明了noConflict函数,下面是源代码:
var window = this, undefined, _jQuery = window.jQuery, _$ = window.$, //把window存入闭包中的同名变量,方便内部函数在调用window时不用费大力气查找它 //_jQuery与_$用于以后重写 jQuery = window.jQuery = window.$ = function(selector, context) { //用于返回一个jQuery对象 return new jQuery.fn.init(selector, context); } jQuery.extend({ noConflict: function(deep) { //引入jQuery类库后,闭包外面的window.$与window.jQuery都储存着一个函数 //它是用来生成jQuery对象或在domReady后执行里面的函数的 //回顾最上面的代码,在还没有把function赋给它们时,_jQuery与_$已经被赋值了 //因此它们俩的值必然是undefined //因此这种放弃控制权的技术很简单,就是用undefined把window.$里面的jQuery系的函数清除掉 //这时Prototype或mootools的$就可以“明媒正娶”了 window.$ = _$;//相当于window.$ = undefined //如果连你的程序也有一个叫jQuery的东西,jQuery可以大方地连这个也让渡出去 //这时就要为noConflict添加一个布尔值,为true if (deep) //但我们必须用一个东西接纳jQuery对象与jQuery的入口函数 //闭包里面的东西除非被window等宿主对象引用,否则就是不可见的 //因此我们把闭包里面的jQuery return出去,外面用一个变量接纳就可以 window.jQuery = _jQuery;//相当window.jQuery = undefined return jQuery; } });
使用时,先引入别人的库,然后引入jQuery,使用调用$.noConflict()进行改名,这样就不影响别人的$运作了。
mass Framework更进一步,在引入种子模块的script标签上定义一个nick属性,那么释放出来的命名空间就是你的那个属性值。里面也偷偷实现了jQuery那种机制。
<script nick="AAA" src="mass.js"></script> <script> AAA.log("xxxxx") </script>
如果你不改,默认还是$——我说过了,大家都对它“垂涎三尺”。