JavaScript的角色巨变和Web技术的发展

曾经JavaScript是职业程序员看不上眼的脚本语言,如今只有高级程序员才能驾驭它。

JavaScript性质和地位的天翻地覆,正是Web技术飞速变化的印证。

最初职业程序员轻视JavaScript,认为它和C、Java这些真正的开发语言相比只是脚本小毛孩(Script Kids)的玩具。那时候,互联网才刚刚从单纯提供静态信息发展到和用户之间有一些互动。JavaScript做的只是跑龙套的角色,检查用户输入,向用户提示信息,做一些四则运算;或者真的是用来做玩具,显示浮动图片,变幻字体大小颜色,丰富鼠标效果。JavaScript在大家的印象里,就是一门语法属于C风格,对格式不那么严格,所能做的只是增加一下页面和用户的互动的辅助性语言。

后来,Web开发随着ASP、Java、PHP的发展大行其道,但是开发还主要集中在服务器端,简单地说,就是业务逻辑加上操作数据库。JavaScript的作用也得到发展,为了模拟传统的客户端应用程序,提供更丰富的功能和友好的操作,比如模拟多级菜单、目录树、多标签页表格,JavaScript操作DOM API成为必不可少的手段。客户端应用程序在功能上渐渐没有优势,安装、升级和维护的劣势使得它和Web应用此消彼长。

进一步有三个因素使得Web应用成为主流。

其一是技术性的原因,即Ajax的发明和普及,大大提高了Web应用的用户体验,因为它不仅消除了提交页面——空白——重新显示这样和客户端应用相比烦人的过程,而且极大地丰富了用户和系统之间互动的可能性——页面不再是一个整体,每一个部分都可以显示独立的信息,跟随用户的鼠标键盘的各种输入各自变化更新。

其二是设计上的原因。传统的客户端应用程序的界面像代码一样符合一定的规则,菜单栏、工具栏、主界面,用户的操作也限定在文本框、单选框、下拉框等一套标准控件中。应用程序的界面似乎就应该这样标准化,就像电脑就应该是有一台主机、一个显示器、一个键盘。这样一种理念部分地是因为程序员不是设计师,和漂亮的界面相比,他们更关心代码的正确和系统的性能;设计师可以用绘图软件画出与众不同的好看设计,但是一方面界面是和功能一道开发的,设计师没有相应的知识和技能将他们的设计结合到程序中,另一方面无论是VB、Dephi还是VC,要想将一套想象出的显示和用户操作编写成新的控件,都是很困难的事。Web开发的情况截然不同。页面和后台程序天然地分开,和前台程序只要设计良好也能完全分离,设计师只需掌握HTML和CSS就可以用各种页面设计软件设计出程序员能够应用的界面。和上面相对应的另一方面,使用HTML+CSS+JavaScript创建一个直观好用的“控件”也比较容易。于是,漂亮精致的界面和方便友好的用户体验如雨后春笋一般涌出。Web应用在界面上迅速超过了客户端程序,在外观上取得了优势。有一段时间,开发Web系统时模仿经典的客户端程序的界面(菜单栏、工具栏和主界面等)很普遍,而现在的桌面应用程序,往往学习的是Web应用美观的界面和简洁的操作。学生已经超越了老师。

第三个原因既是技术的,也是文化的。一个Web应用的前端,包括HTML、CSS和JavaScript,都是开放的。任何一个有兴趣的人,都可以查看、研究、学习、测试和编辑,这一点与传统的代码不可见的客户端程序有巨大区别。互联网开放的文化也和开源的精神相得益彰。层出不穷的界面设计和编程理念可以在互联网这个巨大的平台上展现,相互竞争。经过实践证明的优胜者又迅速被学习传播。这样一个良性的竞争平台,使得Web技术的发展速度大大超过桌面应用程序。

正是在这样一个大背景下,JavaScript的潜力得到充分发挥。大家发现,它天生适合用来做Web的前端开发,而这又是Web应用中日益复杂和重要的部分。JavaScript变成构建丰富的用户界面,实现精致的功能的支柱。因为任务大大增加,JavaScript脚本的长度也迅速增长。提供公共功能,展示最佳实践以至于设置整个应用框架的脚本库大量涌现,日新月异。Prototype、jQuery、dojo、YUI、Knockout、AngularJS……让人眼花缭乱。JavaScript动态语言的本质和采用原型的对象机制,使得完成同样的功能,所需的代码数量比静态的基于类继承的语言,如Java,少很多。但是缺乏编辑时语法检查,浏览器这样一个不友好的开发环境,使得用JavaScript开发复杂的功能容易出错,或者换句话说,需要程序员更加细致。JavaScript语言本身的特性(函数是第一类对象,匿名函数的声明,对象的原义定义),既提供了写出精致优雅的代码的可能性,各种不同的实现方式和风格又需要开发者对语言有更好的掌握和清晰的思路。

终于,JavaScript演变成一门主流语言,充满吸引力和挑战性,并且只有高手才能充分驾驭。

你可能感兴趣的:(JavaScript)