过去人们对于Javascript一直报着轻视的态度人们认为它又慢又容易出错而且在不同浏览器中解释也不一样但是现在Javascript确确实实的在改变我们的网络越来越多的网络和APP应用开始使用Javascript今天我们就来讲讲我们为什么会有这种观念回顾Javascript的历史来诊断他的现状同时通过一些片段来表明Javascript同其他开发语言的本质不同唯有如此我们才能明白为何Javascript这么重要
早期的迷惑
从某种程度上来讲Javascript是Java的恶魔兄弟(Javas evil twin)他们同岁都于年以Beta的版本出现并且都在次年年推出了版本在语法上他们也很相近从名称上来看他们就像是一家人一样
我们第一次听说Javascript是在年当时Netscape推出了Navigator 的Beta版本这个版本中没有包含Javascript但是有对于Java Applet的支持同时Netscape 宣布页面内嵌的语言LiveScript这个声明并没有引起太多的注意在当时Java Applet是一个热门的技术当时对于为什么Netscape要在浏览器中内嵌两种语言也不是十分清楚难道有什么事情LiveScript能做而Java做不了的么?
个月以后LiveScript看到了曙光在Navigator B中它被重新命名为JavaScript这次改动吸引了众多人的关注Oh他肯定不能体现他的价值为什么Sun要让这么个玩具来搭Java的车?我至今仍人为这次改名是一个失败的主意因为他引起了无尽的困惑很多非编程人员从来都没有明白过Java和Javascript是两个不同的东西
改名字的另外一个影响是细微的但是我认为改善了这个语言的接受程度与Java的关系使这门语言看起来并不是一个全新的东西事实上当时Java本身都还不是十分成熟也还没有到但是外界对于Java成熟状况的认知要比本身高出很多例如在年时代杂志将Java选为当年的十大新产品之一同时市面上已经有很多关于Java的书籍所以当Netscape将这项技术命名为JavaScript其意图很明显就是表明当时的Java开发团体是使用和评价JavaScript的最佳人选
在怀疑的浪潮中凭借JavaScript与Java Applet的通信和控制能力JavaScript开始出现在一些应用中所以那些对Java感兴趣的人开始觉得有了学习JavaScript的必要
Javascript就像一个玩具它是面向对象的所有的东西都是公有的没有封装另外你无法创建真正的子类在实例变量和方法之间并没有真正的区别这就像一个灾难你可以在任何时候将一个变量变成一个方法在这方面我并不是孤独的虽然对于面向对象的细节每个人的理解都有所不同但是Java程序员几乎无一例外的认为JavaScript并不是一门严肃的编程语言我们也不像用它来做些什么
附加的伤害
在早期的时候JavaScript并没有什么真正的技术问题它是缓慢又充满风险的并且只在Netscape下工作后来IE也支持了但并不是完全兼容人们吹捧他用来编写页面的applets但是它并不能检测applet的失败它从来没有被广泛的使用过很快他就成为了一个分母人们仅仅用它来完成那些可靠的任务并且避免在其他的地方使用
什么是JavaScript能够可靠的支持的?闪动的基于图像的视觉效果人们开始制造一些炫目的效果Netscape引导了这个趋势在页面中使用令人生厌的图层干扰了人们对正常内容的浏览那些各种各样闪动滚动的效果让我们认为这个标签简直就是网络的原罪到处都充斥着闪动的Banner滚动的Banner状态栏里跳动的文字随时可能弹出的对话框……各种各样的滥用还在不断继续Miscorsoft也开始谈论DHTML但是不久DHTML就变成了BuggySlowUnmaintable网站的代名词
对了不要忘记安全问题一般来讲当你构建一个图灵完备(TuringComplete)的编程语言时你就需要特别小心安全问题Netscape做的不够好早期的Javascript中存在漏洞而且花了很长时间才完全解决掉
结果是什么?很多的有技术头脑的用户关闭了浏览器的Javascript支持要知道在年的时候可以被称为有技术头脑(Technically Savvy)的人员站的比重相当的高所以这些人便不再依赖于JavaScript因为这会导致用户不使用你的网站
那些使用JavaScript的用户做的也不够好那些严谨的程序员完全抛弃了JavaScript但是设计师和页面人员补充了进来早期的书籍中都提供了糟糕的JavaScript实例但是很少去从语义上对它进行分析阐述(David Flanagan是个例外)让事情更糟糕的是有些人(也许是大多数人)根据就没从书中学习过JavaScript他们只是从一个网站现有的代码中拷贝修改然后粘贴到自己的网站上让它工作到最后都不知道为何这些代码能够正常运行
即使大家都是从例子开始学习JavaScript只要保证两件事情这也许会成为一个很好的策略第一个就是大家都学习好的例子但显然JavaScript并不属于这种情况第二种情况就是这种语言应该和学习它的人所知道的另外一种语言相似但是很不幸虽然JavaScript从语义上看来和Java非常相近但实际上JavaScript来自一个和Java完全不同的编程语言家族JavaScript是NewtonScriptSelfSmalltalk……和Lisp语言的一个直系后裔Waldemar Horwat一位在JavaScript早期产生重大影响的工程人员说我更愿意把JavaScript认为是Common Lisp的另一种形式这个说法有些夸张但是如果你知道这两种语言你就会很容易发现两者之间确实存在很多相似之处
所以状况就变的越来越不好一门与之前广泛传播的语言有很大不同的新语言被一些没有经验的编程者推广其他的编程人员Follow了他们的例子更多的用户基于安全考虑关闭了JavaScript的支持还有有经验的程序员推荐大家避免使用JavaScript上面的这些还不够浏览器大战似乎一触即发儿JavaScript被选作了一种武器战争中的双方都不断的发展JavaScript有时候甚至故意引入了很多不兼容特性JavaScript此时已经变得更庞大但同时也更容易引起问题
也难怪没有人会喜欢她
帝国的重建
在那段时间我还是不断听到更多关于JavaScript的消息关于基于prototype和面向对象的特性的介绍总是让我很好奇我曾经看到过的教材里从来没有提到过这些也许是作者本人也没有必要的语言背景去将这些概念联系起来同时人们开始指出由于浏览器造成了多少错误而不是JavaScript本身
后来IE赢了Netscape投降了这一阶段的浏览器大战结束了Miscrosoft开始将他们的bug光芒覆盖到CSS领域(任何处理过IE下页面开发的工程师都应该深有感受)而Mozila的团队则开始认真的考虑兼容性的问题除了一些根深蒂固的区别想要修改他们必须大量的修改源码这个小组修复大多数的不同于是IE和Mozilla/Firefox下的JavaScript变得更可控了其他的开发者也更加的有迹可循
JavaScript和浏览器的内置支持开始进入了一段稳固的发展时期在我们大家都忙着写自己的JavaScript代码的时候几乎没有人注意到一个具有传奇色彩的特性引入XMLHttpRequest最重要的DHTML特性Ajax的重要部分悄悄的加入到了IE中来Microsoft的Outlook小组引入了这个ActiveX控件来使Outlook支持网络访问年的Ajax Experience的大会上Dion Almaer和Ben Galbraith做了很多关于XMLHttpRequest的工作但是在Mozilla第一次引入XMLHttpRequest支持的时候的官方文件中他的特性根本就没有提到
那段时间有很多JavaScript的活动在JavaScript的支持下Macromedia为Flash提供了脚本语言支持Adobe也在不断努力使他们的很多程序可以使用JavaScript来控制和扩展Apple将JavaScript嵌入了它的Sherlock应用中当然Mozilla项目也做出了一个重要决定他们大部分的浏览器都可以支持JavaScript很明显JavaScript已经不再仅仅是一个网页语言而成为了程序中嵌入的动态的运行时扩展的编程语言的首选其中的原因也许是当时大家或多或少的都会一些JavaScript还有当时存在两个高质量的嵌入扩展(SpiderMonkey c语言编写Rhino Java语言编写)
在年的时候一些人(着名的Brent AshleyAlex RussellDouglas Crockford)开始注意到JavaScript究竟能做什么Brend开始研究JavaScript与服务器通信的方法提出了我们现在公认的Ajax Style而且在当时浏览器对于XMLHttpRequest支持不是很完善的时候他增加或者形成了很多完成这项处理的很多巧妙的方法他建立了一个网站Remote Scripts Resources并且编写了一个JavaScript Remote Scripting (JSRS)库来支持不同浏览器的兼容性
Alex Russel建立了一个netWindow项目意图建立一个支持富UI可编程图形环境的网页同时带有完全可拖动的窗口和其他小组件netWindows变成了nWigets并且最终催生了Dojo Project一个当前重要的Ajax框架
Douglas Crockford一直在研究JavaScript语言的丰富性最后他发布了一系列有建设性的文章例如The Worlds Most Misunderstood Programming Language在这些文章中他指出了JavaScript在使用中的一些技巧和一些缺点
BrentAlex和Doug当时的声音都很薄弱就像旷野中的呼声但是当最后其他的Web开发社区准备将注意力投向JavaScript的时候他们所作的这些工作让我们的生活变得更加简单了
我在年到年中段的时候对于JavaScript的关注都只是一些零星的片段我确实没有投入太多的关注我沉浸在Java的乐土中闲暇的时候研究一下Ruby而正是这段经历为我再一次的认识JavaScript提供了准备
在年的月我的朋友给我演示了netWindows当我从地板上捡起我的下巴来以后(After i pick my jaw up off the floor作者还真是幽默)我朋友告诉我说Alex这个人不是疯子我如梦方醒开始认真的研究JavaScript现在看来当时Google也有一帮人在做同样的事情
伟大的革命
每个看这篇文章的人都应该知道一些Ajax第一次引爆屏幕的情景今天我来简短的说一些完整的情节
第一个引起我注意的Ajax应用是Gmail很明显他先是下载了很多的JavaScript然后在后台不断地与服务器进行通信避免页面的刷新他确实给人非常深的印象同时也给其他的技术团队带来不知所措的感觉我当时在想Google一定是有一个非常成熟的定制化工具来开发如此复杂的客户/服务器端管理
真正让我明白的是Google的Google Suggest现在的人一定很熟悉当我们输入的时候通过与服务器的交互将我们可能需要的词条显示出来供我们选择
Google Suggest在两个方面让我印象深刻第一是他是如此简单以至于大多数的技术人员都能够明白他的工作原理并且应用到自己的网络项目中另外一个是Google Suggest针对用户的每次keyup事件进行相应和通信让我看到同服务器通信是如此的简单我完全被折服了
不久以后又袭来了Google MapsJess James Garret形成了Ajax这个术语从此以后讨论变得更加方便
从此以后Ajax变成了我们处理网络应用的的标准方法而且现在我们有了更多的工具和第三方库选择但我们又陷入另一个难题选择太多了
停止担心爱上DOM
我已经阐明了为什么JavaScript有这个名声的众多原因其中有好的也有坏的在这众多的原因中我只想重复一条他是如此重要能够解释为什么很多有经验的程序员经给被自己的经验所蒙蔽
这一部分作者以一个例子来说明了JavaScript的编写方式和Java是多么的不同最后提出了一些有意义的总结Functions are firstclass objects Methods are just functions attached to objects You can add methods to classes at any time (even after instances have been created)
Individual objects can have their own methods ``Class constructors are just functions Functions being objects can have their own properties You can call functions with fewer (or more) arguments than the function is declared to take If no value is passed for a function argument it gets the value undefined
总结最后让我们每一位JavaScript开发者来正确的认识JavaScript用它来完成他应当完成的任务
Ajax is a gateway drug for JavaScript
[参考资料] Learn To love Javascript
NewtonScript
Java In Best Top Ten of l