`
caolixiang
  • 浏览: 7824 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

雄辩的JavaScript(经典翻译计划1)

    博客分类:
  • Js
阅读更多

 

亲们,以前看过一个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,计算能力与人类理性

 

程序是一个复杂体。它既是程序员编写的一个代码片段,又是电脑工作的指导力量,既是内存中的数据,同时它又控制了内存中数据的行为。尝试类比程序和我们日常生活中事物的相似性,往往功亏一篑,但是对机器来说或许很合适。机械手表的齿轮巧妙地结合在一起,如果制表人技艺足够精湛,手表可以连续几年精准地报时。程序中的元素以相似的方式组合,如果程序员明白他所作的一切,程序运转将不会崩溃。

 

电脑整合了这些无形的部件。电脑只会毫无智能地,直线型地执行命令,它的优势在于以惊人的速度执行它们。一个程序可以优雅地组合这些简单的命令,完成很复杂的任务。

 

对于一些人而言,写程序是一种非常吸引人的。程序是一系列思想的组合。构建它们是廉价的,轻量级的,只要双手敲击键盘,程序便会增长。如果失去了对程序的控制,它的大小、复杂性将会失控地增长,哪怕是它的开发者也会感到迷惑不解:这个是编程存在的主要问题,也是如今那么多程序无故地挂掉、崩溃的原因。

 

 

程序运行时是无比美丽的,编程的艺术就是控制复杂性的艺术。出色的程序是可控的,复杂度较低的。

 

 

如今很多程序员认为使用一系列熟知的技术集合就可以很好地控制程序的复杂性。他们给程序的形式定义了一系列复杂的教条。


 

为了使得程序更加直观和可预见,而为神奇和美丽的程序设置若干禁忌,的确妨碍了编程的丰富性啊!编程技术的全景是多样性、广阔和吸引人的,还有许多未知等待我们去发见。陷阱和圈套大大减少了它们,甚至把许多资深的程序员引向了可怕的错误深渊,但这些仅仅提醒你要如履薄冰,与机智随行。学习的过程中你总会遇到新的挑战,新的领域也将等待你去探索。拒绝探索的程序员将会停止不前,失去乐趣,当然也会失去前进的动力(成为一个专家的动力)。

 

正如我提到的,一个程序员的准则是无所谓对错的。效率、清晰、程序大小的控制也同样重要:但是如何在这些相互对立的因素上取得平衡是一件让人头大的事情。规则是重要的,适时地打破规则同样重要。

 

 

计算机诞生时,是没有程序设计语言的。编程看起来像下面这样:


 

00110001 00000000 00000000
00110001 00000001 00000001
00110011 00000001 00000010
01010001 00001011 00000010
00100010 00000010 00001000
01000011 00000001 00000000
01000001 00000001 00000001
00010000 00000010 00000000
01100010 00000000 00000000

 

 

这是一个从1一直加到10的程序,它指出了结果(1 + 2 + ..  + 10 = 55)。那种结构非常简单的计算机就可以执行它。在早期的计算机上编程,要在正确的位置上设置许多排列好的开关,并且从卡片机上输入数据。你会觉得这是一个令人郁闷的,随时都会发生错误的过程。即使编写最简单的程序,都需要耗费大量人类智能,设置许多规范,涉及众多复杂的特性。

 

当然,手工输入这些诡异的比特位(也就是01)给程序员们带来了巨大的满足和成就感,就像巫师一般,是很值得的。

 

上面的每一行数字串代表了一个单独的指令,如果用自然语言描述应该是这样:

 

  1. 0储存在内存位置0
  2. 1储存在内存位置1
  3. 将内存1位置的值储存到内存2位置
  4. 内存位置2中的值减去11
  5. 如果内存位置2中的值为0那么执行指令9
  6. 把内存位置1中的值加到内存位置0
  7. 内存位置1中加1
  8. 回到指令3
  9. 输出内存0位置中的值

 

虽然这样描述易懂一些,还是让人感到不爽。用名字替代指令和位置似乎会好一些:

 

'total'设置为0

'count'设置为1

[loop]

'compare'设置为'count'

'compare'中减去11

如果'compare',跳转到[end]

'count'的值加到'total'

'count'中加1

跳转到[loop]

[end]

输出'total'

 

到这一层面上不难理解程序是如何运行的了。你理解了吗?最开始的两行赋予两个内存位置起始值:total用于计算程序的结果,count用于计算和跟踪当前的数值。使用compare的一行是最晦涩的。程序用这行判断count是否为11,以便停止程序的循环。程序如此之原始,以至于只能通过检查是否为0,并依据这个检查结果进行跳转。所以这个内存位置被命名为compare,计算count - 11的值,并且依据这个结果来做出行动。后面的两行将count加到了结果中,并且使count增加1,只要count不为11,就会持续增加下去。


同样的程序用Javascript实现起来是这样的:


 

var total = 0, count = 1;
while (count <= 10) {
	total += count;
	count += 1;
}
print(total);

 

 

可以看到诸多本质上的提升,最重要的是这里已经没有必要通过特定的方法实现程序的回退与执行,一切工作都由神奇的while关键词完成了,程序会执行下去,直到满足了count <= 10这个条件。显然,也没有必要创建临时的变量去判断它是否为0。细节上确实有些傻瓜化了,程序设计语言的威力在于为我们傻瓜化地处理很多细节。

 

下面展示了程序需要便捷化处理一些过程时的形式,对一系列数的集合计算它们的和。


 

print(sum(range(1, 10)));

 

 

程序可以表示为长整数、短整数;可读或者不可读的。第一个版本的程序特别晦涩,最后一个更接近于自然语言:打印出从110的和。(我们将在后面的章节看到如何构建sumrange这些工具)

 

优秀的程序设计语言,为程序员提供了一个更为抽象的表述方法。它隐藏了不友好的细节,提供了方便的块(像while这样的结构),而且总是能让程序员去创建他们自己的块(像sumrange这些操作)。

 

 

JavaScript就是这样一种语言,如今,用于智能地解决网页中遇到的各种棘手的问题。一些人认为下一代JavaScript语言将会成为处理更多其他问题和任务的重要语言。我不知道是否真的会有那么一天,但是如果你对JavaScript兴趣十足,的确值得学习它。即使你以后不会从事web开发 ,书中的经验也会一直跟随你。

 

有些人认为JavaScript有些糟糕的特性,大部分是属实的。当我最初用JavaScript编程时,很快就开始诟病它了:它默认接受几乎我输入的一切代码,但是以完全不同的方式解释和执行。对所做的工作失去线索的确是一个事实,然而真正问题是:JavaScript赋予了程序员巨大的自由。这样的初衷是使得初学者能够快速上手,但是现实是发现程序中的问题愈加困难,程序根本不会告诉你,错误在哪里。

 

然而,灵活性也是一个程序设计语言的优势所在。JavaScript给予了程序员更多空间和技术去完成多数其他严格类型的语言不可能完成的事情:这个特性足以弥补JavaScript的劣势。正确地学习和使用JavaScript语言一段时间后,我渐渐喜欢上了她。

 

 

与名称截然不同,JavaScriptJava程序设计语言关系甚微。命名完全处于营销角度,而不是理性地考虑。1995年当JavaScript被网景引入之时,Java正红得发紫,有些人认为搭上这个营销快车是一件很赞的事情,可以如今我们在名称上迷糊了。


 

ECMAScriptJavaScript关系最为紧密。当除网景以外其他浏览器支持JavaScript特性时,它们看起来更像是ECMAScript,随后文档精确规定了这种语言的工作方式,在文档中,经过委员会的标准化,它被称为ECMAScript

 

ECMAScript定义了一种通用的程序设计语言,只字未提这种语言针对浏览器的拓展。JavaScript是专门针对网页和浏览器的ECMAScript的拓展。

 

还有一些程序设计语言基于ECMAScriptAdobe Flash使用的ActionScript是其中最重要的一种。Flash使得网页丰富化,当然也带来了不少噪声。了解JavaScript不会影响你去构建Flash应用。

 

本书写作之时,人们正在使用ECMAScript4ECMAScript4有几种不同的版本,每一种都有一些特性。完全不用担心这些特性会影响你现在的学习。ECMAScript4更像是我们现在使用版本的拓展,本书提到的一切几乎都会被保持。除非这些新的特性被所有现代浏览器支持,否则,ECMAScript4web编程实用化还有很长的距离。

 

 

 

本书的章节中包含了大量的代码(编者注1)。就我的经验看来,阅读和写代码是一种重要的学习方法。不要只随便浏览这些代码,仔细地阅读和理解它们:最开始可能漫长和无聊,但是你会很快地掌握它,对练习也是一样。除非你确确实实解决了问题,否则不要假设你掌握了它们。

 

基于网页的工作方式,看到其中的JavaScript代码很容易,这也是一种学习方式。纳闷的是,很多程序员并不是很专业,并没有认真学习和掌握JavaScript,因此网页里充斥着很多低质量的代码。近朱者赤,近墨者黑,所以当心了!

 

 

为了使你体验JavaScript编程,无论是实例还是你自己编写的代码都可以通过控制台窗口执行。如果你使用现代图形化浏览器(IE6及更高版本,FireFox1.5或者更高版本,Safari3或者更高版本),打开控制台就可以了。

 

控制台包含了三种重要的元素:显示错误信息和执行结果的输出窗口,JavaScript代码输入区。尝试在里面输入一个数字然后按回车执行,如果程序有意义,它将会展示输出结果。下面试着输入wrong!,输出窗口是不是给出了错误信息?通过上线方向键可以调出你以前输入过的代码。

 

对于大一些跨多行的代码块,可以使用控制台右边的区域。“Run”按钮用于执行这个区域的代码,同时打开多个程序是可以的:用“New”和“Load”可以怎么新的程序。当打开了不止一个文件时,“Run”可以选择其中一个执行,当然通过“Close”可以关闭它们。

 

本书中的示例通过矩形框包围,鼓励你修改它们,最糟糕的结果就是死循环了。

 

幸运的是,浏览器会监测这些害虫,长时间运行无结果的程序进程会被干掉。

 

 

在后面的章节里,我们会一起构建包含多个代码块的程序。

 

 

代码:代码是编程的产物。程序中的一行或者这个程序都可以被称作代码。

 

 

2012414 于杭州

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics