雄辩的JavaScript(经典翻译计划1)
?
亲们,以前看过一个JavaScript入门的推荐帖子(article.yeeyan.org/view/188878/225166),其中推荐了若干书目,但是一大部分还木有翻译。计划在最近一年把它们汉化,分享给大家。
第一本书是《Eloquent JavaScript》,就从这里开始吧。
EloquentJavascript
An opinionated guide to programming
by Marijn Haverbeke
前言
雄辩的Javascript(译者注:翻译为生动更为贴切)是一本有思想性针对Javascript的导论(教程),这是一本电子书。除了描述性地语言外,包含了大量的实例,创造了一个试验并与实践这些实例的环境。
本书的读者是小虾们。有一些编程经验的菜鸟,可以略过2到5章,这些概念你可能已经很熟悉了。当然请要阅读第一章的最后部分,这个部分有许多关于本书的重要信息。
本书是免费的,可以按照你的需要使用全书或者其中的某些部分,使用时请标注我是原作者。
?
第一章 Introduction
?
个人电脑最初被引入时,多数装配了BASIC这样简单的程序设计语言。当时,与电脑进行交互基本上等同于与编程语言进行交互,每一个个人电脑的使用者,无论是出于主动还是被动,都尝到了编程语言的滋味。现在个人电脑越来越多,越来越廉价,用户只需要通过鼠标就能和个人电脑进行交互:对于多数用户来说,这足够了。但是对于那些技术控,将程序设计从日常使用中分离,是一件很不方便的事情。
?
幸运的是,作为web编程中一种高效的开发方式,现代浏览器都有一个Javascript开发和解释环境。不用技术细节给用户带来不必要的麻烦是一个信条,因此Javascript总是很好地隐藏,浏览器使其生效,同时也成为了一个学习编程的平台。
?
这个正是这本书希望传达的。
?
…
?
子曰:“不愤不启,不悱不发,举一隅不以三隅反,则不复也。”
???????????????????????????? ——孔子
?
除了介绍JavaScript,本书也尝试介绍编程的基本原则。编程,是复杂的。但是基本的原则,多数时候是简单的。当程序构建在这些基本的原则之上时,规则和复杂性就没有那么简单了。编程应该是简单和可预测的,正如这一领域的先驱Donald Knuth所说,编程是一门艺术。
?
如果想从本书获得一些比粗略浏览更为重要的干货。请保持你的敏锐,去钻研、解答练习题,只有坚持才能确保你理解了它。
?
…
?
电脑程序员是宇宙的创造者,这个宇宙由他创造也由他负责,程序语言会创造几乎无限复杂的宇宙。
?
???????????????????????????????? ——Joseph Weizenbaum,计算能力与人类理性
?
程序是一个复杂体。它既是程序员编写的一个代码片段,又是电脑工作的指导力量,既是内存中的数据,同时它又控制了内存中数据的行为。尝试类比程序和我们日常生活中事物的相似性,往往功亏一篑,但是对机器来说或许很合适。机械手表的齿轮巧妙地结合在一起,如果制表人技艺足够精湛,手表可以连续几年精准地报时。程序中的元素以相似的方式组合,如果程序员明白他所作的一切,程序运转将不会崩溃。
?
电脑整合了这些无形的部件。电脑只会毫无智能地,直线型地执行命令,它的优势在于以惊人的速度执行它们。一个程序可以优雅地组合这些简单的命令,完成很复杂的任务。
?
对于一些人而言,写程序是一种非常吸引人的。程序是一系列思想的组合。构建它们是廉价的,轻量级的,只要双手敲击键盘,程序便会增长。如果失去了对程序的控制,它的大小、复杂性将会失控地增长,哪怕是它的开发者也会感到迷惑不解:这个是编程存在的主要问题,也是如今那么多程序无故地挂掉、崩溃的原因。
?
…
?
程序运行时是无比美丽的,编程的艺术就是控制复杂性的艺术。出色的程序是可控的,复杂度较低的。
?
…
?
如今很多程序员认为使用一系列熟知的技术集合就可以很好地控制程序的复杂性。他们给程序的形式定义了一系列复杂的教条。
?
为了使得程序更加直观和可预见,而为神奇和美丽的程序设置若干禁忌,的确妨碍了编程的丰富性啊!编程技术的全景是多样性、广阔和吸引人的,还有许多未知等待我们去发见。陷阱和圈套大大减少了它们,甚至把许多资深的程序员引向了可怕的错误深渊,但这些仅仅提醒你要如履薄冰,与机智随行。学习的过程中你总会遇到新的挑战,新的领域也将等待你去探索。拒绝探索的程序员将会停止不前,失去乐趣,当然也会失去前进的动力(成为一个专家的动力)。
?
正如我提到的,一个程序员的准则是无所谓对错的。效率、清晰、程序大小的控制也同样重要:但是如何在这些相互对立的因素上取得平衡是一件让人头大的事情。规则是重要的,适时地打破规则同样重要。
?
…
?
计算机诞生时,是没有程序设计语言的。编程看起来像下面这样:
?
print(sum(range(1, 10)));
?
?
程序可以表示为长整数、短整数;可读或者不可读的。第一个版本的程序特别晦涩,最后一个更接近于自然语言:打印出从1到10的和。(我们将在后面的章节看到如何构建sum和range这些工具)
?
优秀的程序设计语言,为程序员提供了一个更为抽象的表述方法。它隐藏了不友好的细节,提供了方便的块(像while这样的结构),而且总是能让程序员去创建他们自己的块(像sum,range这些操作)。
?
…
?
JavaScript就是这样一种语言,如今,用于智能地解决网页中遇到的各种棘手的问题。一些人认为下一代JavaScript语言将会成为处理更多其他问题和任务的重要语言。我不知道是否真的会有那么一天,但是如果你对JavaScript兴趣十足,的确值得学习它。即使你以后不会从事web开发 ,书中的经验也会一直跟随你。
?
有些人认为JavaScript有些糟糕的特性,大部分是属实的。当我最初用JavaScript编程时,很快就开始诟病它了:它默认接受几乎我输入的一切代码,但是以完全不同的方式解释和执行。对所做的工作失去线索的确是一个事实,然而真正问题是:JavaScript赋予了程序员巨大的自由。这样的初衷是使得初学者能够快速上手,但是现实是发现程序中的问题愈加困难,程序根本不会告诉你,错误在哪里。
?
然而,灵活性也是一个程序设计语言的优势所在。JavaScript给予了程序员更多空间和技术去完成多数其他严格类型的语言不可能完成的事情:这个特性足以弥补JavaScript的劣势。正确地学习和使用JavaScript语言一段时间后,我渐渐喜欢上了她。
?
…
?
与名称截然不同,JavaScript和Java程序设计语言关系甚微。命名完全处于营销角度,而不是理性地考虑。1995年当JavaScript被网景引入之时,Java正红得发紫,有些人认为搭上这个营销快车是一件很赞的事情,可以如今我们在名称上迷糊了。
?
ECMAScript与JavaScript关系最为紧密。当除网景以外其他浏览器支持JavaScript特性时,它们看起来更像是ECMAScript,随后文档精确规定了这种语言的工作方式,在文档中,经过委员会的标准化,它被称为ECMAScript。
?
ECMAScript定义了一种通用的程序设计语言,只字未提这种语言针对浏览器的拓展。JavaScript是专门针对网页和浏览器的ECMAScript的拓展。
?
还有一些程序设计语言基于ECMAScript。Adobe Flash使用的ActionScript是其中最重要的一种。Flash使得网页丰富化,当然也带来了不少噪声。了解JavaScript不会影响你去构建Flash应用。
?
本书写作之时,人们正在使用ECMAScript4。ECMAScript4有几种不同的版本,每一种都有一些特性。完全不用担心这些特性会影响你现在的学习。ECMAScript4更像是我们现在使用版本的拓展,本书提到的一切几乎都会被保持。除非这些新的特性被所有现代浏览器支持,否则,ECMAScript4距web编程实用化还有很长的距离。
?
…
?
?
本书的章节中包含了大量的代码(编者注1)。就我的经验看来,阅读和写代码是一种重要的学习方法。不要只随便浏览这些代码,仔细地阅读和理解它们:最开始可能漫长和无聊,但是你会很快地掌握它,对练习也是一样。除非你确确实实解决了问题,否则不要假设你掌握了它们。
?
基于网页的工作方式,看到其中的JavaScript代码很容易,这也是一种学习方式。纳闷的是,很多程序员并不是很专业,并没有认真学习和掌握JavaScript,因此网页里充斥着很多低质量的代码。近朱者赤,近墨者黑,所以当心了!
?
…
?
为了使你体验JavaScript编程,无论是实例还是你自己编写的代码都可以通过控制台窗口执行。如果你使用现代图形化浏览器(IE6及更高版本,FireFox1.5或者更高版本,Safari3或者更高版本),打开控制台就可以了。
?
控制台包含了三种重要的元素:显示错误信息和执行结果的输出窗口,JavaScript代码输入区。尝试在里面输入一个数字然后按回车执行,如果程序有意义,它将会展示输出结果。下面试着输入wrong!,输出窗口是不是给出了错误信息?通过上线方向键可以调出你以前输入过的代码。
?
对于大一些跨多行的代码块,可以使用控制台右边的区域。“Run”按钮用于执行这个区域的代码,同时打开多个程序是可以的:用“New”和“Load”可以怎么新的程序。当打开了不止一个文件时,“Run”可以选择其中一个执行,当然通过“Close”可以关闭它们。
?
本书中的示例通过矩形框包围,鼓励你修改它们,最糟糕的结果就是死循环了。
?
幸运的是,浏览器会监测这些害虫,长时间运行无结果的程序进程会被干掉。
?
…
?
在后面的章节里,我们会一起构建包含多个代码块的程序。
?
…
?
代码:代码是编程的产物。程序中的一行或者这个程序都可以被称作代码。
?
?
2012年4月14号 于杭州