本节书摘来自异步社区《JavaScript框架设计》一书中的第1章,第1.6节,作者:司徒正美 更多章节内容可以访问云栖社区“异步社区”公众号查看。
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>
如果你不改,默认还是$——我说过了,大家都对它“垂涎三尺”。