窥探jQuery——面向JavaScript程序员(4)

作者:yangyang 时间:2008-06-17 14:35:00 

并非天衣无缝(Leaky abstractions)

在发掘jQuery各种特性的同时,我也被某个我视之为教条(philosophical blocker)的东西所折磨着。几年来,我总是建议大家使用一种JavaScript库,前提是你们愿意梳理它的源码,并把它的工作原理彻底搞懂。我发出如此论调,是基于Joel Spolsky的不健全抽象的法则(译注[4])。在那篇文章中,Joel指出,API把复杂性隐藏的越多,当它出现无法应付的意外时,你越有可能遭遇更多的麻烦。浏览器平台是不健全抽象的最佳代表,所以当库无法帮你摆脱困境时,你要自寻解药。保持警觉非常重要。

jQuery 使用了相当不可思议的技术,以求实现它所设想的各种功能——其中一些(比如选择器的代码)真是震天骇地。如果有必要彻底搞懂一个库的工作原理,那么对大多数开发人员来说,jQuery不会是上佳之选。然而,jQuery拥有极高的人气,并且没有太多与之相关的恐怖经典流于街巷(译注:原文是a distinct lack of horror stories,比如微软Win95的“蓝屏”就是恐怖经典:),所以具体到jQuery所用技艺的邪正之分,也就变得不那么重要了。

我想,我必须重新审视曾给大家的建议。库的运作机制并不是问题焦点:关键是应看清更具普遍性的潜在问题,知晓浏览器之间的差别,以及你使用库的哪种技术,来消除差别造成的负面影响。没有哪种库可以一劳永逸地帮你克服浏览器的古怪行为。但只要你对应付潜在问题训练有素,便可把握经脉,指出问题的源头——无论它们来自你自己编写的代码,还是库或者应付策略本身。

结语(To conclude)

我费了那么多口舌,希望能让大家明白,jQuery不只是又一个JavaScript库那么简单——它蕴含了很多值得品味揣摩的理念,甚至能启迪那些骨灰级的JavaScript程序员。如果你不打算尝试jQuery,但仍值得去花些时间探索一下jQuery的生态体系(the jQuery ecosystem)。

Simon Willison写于2007年8月15日 凌晨2:27

译注:

[1] bookmarklet在原文中指的是一段“Insert jQuery”的JavaScript代码,由于译者使用Google Docs进行在线翻译,链接中的JS代码被编辑器屏蔽掉了,下面列出的代码可粘贴到浏览器的地址栏中执行,执行后才可以继续用示例代码查看jQuery的选取效果:
javascript:void(function(){var s=document.createElement('script');s.src='http://code.jquery.com/jquery-1.1.2.js';document.getElementsByTagName('head')[0].appendChild(s);}())

[2] 本文使用的术语“链盒”,大抵可对应单词chain/chaining/chainable;译者在参考jQuery Magazine issue 1对jQuery 选择器运行方式的图解后,确定了这种译法。汉字是象形文字,按“盒”字的构造来体会jQuery颇有意趣:比如上面的“人”字,不正是选择器“吐出”特定元素的“嘴”吗?而“人”字下面“一”“口”“皿”的逐层累积,其形状又类似jQuery的Logo,并让人联想到链式选取过程中不同的元素集合;“盒” 即是“桶”(bucket),译者自以为绝妙!

[3] IBM developerWorks中国的官方翻译版本《使用jQuery简化Ajax开发》;译言版本分1、2两部分,由令狐葱翻译。

[4] Law of Leaky Abstractions: All non-trivial abstractions, to some degree, are leaky. 详细解读请见原文。

标签:jQuery,库,javascript
0
投稿

猜你喜欢

  • IDEA连接MySQL数据库并执行SQL语句使用数据图文详解

    2024-01-14 13:57:09
  • 关于python常见异常以及处理方法

    2021-03-17 06:13:34
  • mysql 5.7.17 安装配置方法图文教程(ubuntu 16.04)

    2024-01-17 20:39:43
  • js中常用的Tab切换效果(推荐)

    2024-02-27 11:48:23
  • 关于javascript DOM事件模型的两件事

    2024-05-13 09:37:11
  • python使用Tkinter显示网络图片的方法

    2021-09-26 18:25:38
  • python中列表元素连接方法join用法实例

    2023-01-20 17:49:31
  • Go语言实现字符串切片赋值的方法小结

    2024-02-01 14:30:19
  • ASP提速技巧五则

    2008-03-20 13:20:00
  • JavaScript实现Tab标签页切换的最简便方式(4种)

    2024-04-17 10:30:36
  • python的迭代器,生成器和装饰器你了解吗

    2024-01-02 12:45:12
  • 在pyqt5中展示pyecharts生成的图像问题

    2023-10-17 10:59:46
  • 浅谈pc端rem字体设置的问题

    2024-05-22 10:27:44
  • go GCM gin中间件的加密解密文件流处理

    2024-04-26 17:32:36
  • 获取url中用&隔开的参数实例(分享)

    2024-05-28 15:40:46
  • pandas 取出表中一列数据所有的值并转换为array类型的方法

    2023-10-04 15:12:52
  • JavaScript中尽量用局部变量的原因[译]

    2009-02-20 13:45:00
  • 在MySQL中为何不建议使用utf8

    2024-01-27 07:07:58
  • Python做文本按行去重的实现方法

    2021-12-31 17:41:07
  • Bootstrap进度条与AJAX后端数据传递结合使用实例详解

    2024-04-28 10:18:32
  • asp之家 网络编程 m.aspxhome.com