回顾我的编程生涯,有三种编程语言给我学习JavaScript打上了良好的基础(之所以这么说,是因为JavaScript的确有一些比较难学的地方):

  • Scheme: 在我进入大学信息专业的第一学期,我通过经典的“计算机程序的构造和解释”(免费在线阅读)一书学习了Scheme语言.当初,JavaScript从Scheme中学到了闭包[1].最近,受Racket(一种Scheme方言)的启发,ECMAScript 6中又增加了一种称之为private symbol的对象类型来实现“私有性(privacy)” [2].
  • Self: 随后,我还粗略的学习过基于原型的面向对象语言.期间看过一篇很有见地的论文:“不使用类来组织程序”.这篇论文通过描述一种称之为Self的语言(另一种在JavaScript发明时期影响了它的语言)讲到了下面这些知识点:"基于类的语言中存在有两种关系:谁是谁的实例(对象和类之间的关系)和谁是谁的子类(类和类之间的关系).基于原型的语言中只存在有一种关系:谁是谁的原型(对象和对象之间的关系).虽说如此,但在这两种不同的面向对象语言中,该如何组织自己的程序,还是很类似的".
  • Java: 通过学习Java,有三点可以影响到你对JavaScript的学习.首先是语法,因为在发明JavaScript的时候,JavaScript之父收到的命令就是“它的语法必须看起来像Java[1].第二点是,它能帮助你学会面向对象的编程,虽然有时候会觉的Java的语法有点死板.“Effective Java”(亚马逊购买链接)一书是一本很好的Java入门书籍.第三点,你还能知道一个好的IDE(Eclipse等)应该是什么样的,在这一方面,JavaScript仍然需要努力向前赶.

除了我所说的这三种语言,肯定还有一些其他的语言,能让你把一些在这些语言中学到的原理稍加修改(或者完全一样)就能应用到JavaScript的学习中.

译者注:很遗憾,我没有学过Scheme和Self,和大部分人一样,我也费了不少劲才算搞明白JavaScript中的闭包和原型.不过我接触过awk,Perl和Python,.这三门语言也对JavaScript产生了一定的影响.

awk的函数声明写法是这样的:

function add(a,b){
    return a+b
}

你看见了,和JavaScript中函数声明的写法一模一样,因为function这个关键字就是来自awk的,证据是"Coders at Work"一书中Brendan Eich接受采访时说过的话:

One more positive influence, and this is kind of embarrassing, was awk. I mean, I was an old Unix hacker and Perl was out, but I was still using awk for various chores. And I could’ve called these first-class functions anything, but I called them “function” mainly because of awk. An eight-letter keyword—it’s kind of heavy, but there it is.

再来说Perl,JavaScript中的正则表达式语法是从Perl来的.各种数组方法push,pop,shift,unshift,splice,join,reverse,sort,都是来自于Perl中的同名函数.我在SpiderMonkey源码中搜索过"Perl",结果如下:

scheme java scheme javascript_Python

这些注释几乎都是Brendan Eich亲手写的.如果你熟悉Perl,在开始学习JavaScript的时候就不会对这些来源于Perl的方法和特性感到陌生.

那Python呢?在发明JavaScript的时候,Python才刚刚起步(1.2),目前的JavaScript貌似没有从Python中学到些什么(修正(2013.2.25):这里说错了,多少还是有一点的,看下面的追记),不过未来的JavaScript会,ECMAScript 6中的迭代器和生成器,yield表达式,数组(生成器)推导式,默认参数,剩余参数,解构,模块等等,都或多或少的学习了Python中的类似语法.如果你没接触过Python,学习这些东西会花费不少时间,相反,这些东西几乎没有什么学习成本.

有些人说:"学习编程语言要精通一门,学的多会导致全面平庸".嗯,前半句是对的,但后半句是错的.