当jQuery在2006年1月现身时,它给人的第一印象是,这玩意儿构造得很精明。基于CSS选择器来打点一切,其思路相当灵巧。但链盒工事看起来更像个噱头,并且整体看来,jQuery库提供的功能并不能覆盖所有基础性的东西,jQuery会不会只是昙花一现呢?
jQuery拥有简洁的方法,把大量常用功能封装起来,并提供精巧的插入式API,来满足标准库之外的功能模块的实现。jQuery秉持的核心,乃DOM元素的集合——它把元素集合作为一个根本,给高度抽象出来了。最重要的,是这种遵循最佳实践的抽象,能让jQuery与其他JavaScript代码相处融洽。
很多对jQuery的介绍,都是针对设计师和初级开发人员。但接下来文章想说明的是,为什么jQuery也会吸引那些富有经验的开发人员。(相关阅读:jQuery让开发者恋恋不舍的秘密)
名称空间
编写可重用的、优秀的JavaScript代码,其关键在于对名称空间的积极把控。JavaScript只拥有单一的、全局的名称空间(即window对象),而很多程序员(以及一些库)恣意地为之添加各种东西。要知道全局变量是魔鬼!聪明的开发人员,会使用类似组件模式的技术,来尽力减少全局对象的数量。
jQuery仅向全局名称空间引入一个标记:jQuery函数/对象。其余的要么是jQuery的直接属性,要么就是调用jQuery函数所返回的对象的方法。
那 “语言升级”又是什么呢?大多数库会提供映射,过滤,剥离,往往是浏览器的JavaScript引擎所缺少的那些功能。还有一些库,直接扩 展了JavaScript内置的String和Array类,但这是冒险的做法。String.prototype和Array.prototype也有各自的名称空间,在其内添加的属性一旦发生冲突,所带来的风险,不亚于在全局环境下的草率大意。
在语言升级方面,jQuery提供了很多函数(功能),但每个函数都被赋给jQuery对象的属性:jQuery.each,jQuery.extend,jQuery.grep,jQuery.map,jQuery.merge以及jQuery.trim。如此一来,它们就不会跟其他代码产生冲突。
声名狼藉的$函数
jQuery是唯一被引入的全局标记,其实并不尽然:$标记作为jQuery的快捷方式,也被引入进来。庆幸的是,$的存在不会带来负面影响:如果你需要让原始的$起死回生(比如,这之前你的代码使用了Prototype),你可以调用jQuery.noConflict()来恢复它。如果你既想拥有$的便利,又不希望jQuery跟其他同样使用了全局$函数的代码发生冲突,可遵循jQuery文档所建议的惯用方式:
- (function($) {
- // 在这个函数体里,$可作为jQuery的引用
- // 很方便,对吧?
- })(jQuery);
把一切都附加到$标记的做法,曾让人觉得jQuery华而不实。不过,从体系的角度来审视这种设计,一切又是非常明了的。