这个世界上确实有很多写得很差的JavaScript。
这听了让人很伤心,导致这种情况的一个最大原因就是JavaScript有一个隐式的全局作用域。这个功能本来是为那些偶尔写些代码的非开发人员准备的,但这可能是Necscape最坏的设计之一。但就像其他编程语言一样,JavaScript也还有非常大的潜力可以挖掘。
在最初设计的时候,无论是JavaScript本身还是用JavaScript开发的应用程序都是很简单的。一些想法,比如外部聚合程序或者基于互联网的富客户端应用程序,在当时简直就是不可想象的。由于这种心态,宽松的类型限制以及把所有变量都定义为全局变量,就变得理所应当了。不幸的是,这种想法非常的缺乏前瞻性。
在我们生活的世界里,充斥着通过复制粘贴建立起来的应用程序,这导致JavaScript框架遍地都是,而就算这样那些非程序员还是对这些框架敬而远之,而与此同时,在他们写的代码中,可能有七个循环使用同一个i变量来计数。
听起来很糟糕么,不是么?
如何才能做的更好
JavaScript本身已经发生了一些改变,我们需要开始更加认真的对待这门语言。由于某些原因,没有几个人仔细研究JavaScript编程。正如Douglas Crockford所说,大部分人都在弄虚作假(most people just fake it)。我必须承认,我曾经也是这群人中的一份子。只有在后来我开始认真对待这门语言以后,我的代码质量才开始不断提升。现在我已经对这么语言有了全新的认识,而且我发现自己已经喜欢上它了。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)就算是JavaScript专家们也需要开始清理自己的代码。你可以尝试使用至少五个JavaScript框架,最后选择一个你最喜欢的,比如Prototype、Script.aculo.us、MooTools、DoJo、或者其他你顺手的,这些框架都可以在全局命名空间下提供很多的功能支持。
但对我个人来讲,这些都还不足以让人满意。
大家把太多的类库嵌入到程序中,而类库又带来了太多的全局变量,实际上我们根本不需要这么多全局变量。Prototype为什么不能离开现有的prototype而独立开发呢?为什么Dojo也是如此呢?YUI提供了独立的命名空间,jQuery也快了,希望每个人都能追随他们的脚步。
这比你想的要简单
命名空间通过一种简单的方式为你全部的代码定义了一个容器。在JavaScript里,你可以把任何内容放到这个容器里:变量、函数、对象或者其他什么。而操作简单到你只需增加一对花括号。
var MIKEG = {};
MIKEG是一个空对象。它将成为我用JavaScript编写的所有应用程序的起点。比如说,为了更好地操作XHTML和DOM,我决定增加两个函数,那么这两个函数将被置于MIKEG对象内。
// 建立一个HTML子命名空间,用来保存所有和HTML相关的函数
MIKEG.html = {};
MIKEG.html.generateElement = function (sName, elParent, oAttributes) {
// 这里写代码
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)};
MIKEG.html.applyAttributes = function (elTarget, oAttributes) {
// 这里写代码
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)};
看吧,就是这么简单。现在我所有的应用程序中只有一个全局变量:MIKEG。通过这一个全局变量,我就可以访问所有我需要的内容。我的代码看起来很清晰也很容易理解。而且,只要我严格遵守这个规则,那么我的代码就不会和其他人发生冲突。
YUI提供了一套非常棒的工具帮助开发者保持自己代码的条理化:YAHOO.namespace()。通过这个函数就可以直接把命名空间注册到YAHOO的类中。
在开发过程中,我坚持使用自己的MIKEG命名空间,这样就可以不受其他类库的影响,因为我大部分的代码也都是独立的类库,可以被100%移植到其他项目中。我建立了一个专门的命名空间,用来调用YUI的代码。除了显式的调用YUI界面对象,我可以确保我的程序不会和其他变量进行交互。
网络正在不断改变,JavaScript也越来越流行,JavaScript所依赖的平台也变得越来越稳定。我们有义务像专家们那样编写清晰的、稳定的和可扩展的代码。命名空间不可能解决JavaScript曾经存在的所有问题,但至少可以让我们的代码更加的易于维护。