最近笔者使用node.js完成了一个小型项目,在javascript的泥坑里面摸爬滚打了一番,感触颇深。Javascript会给习惯于传统面向对象模式的开发人员,带来很多意想不到的障碍。这些问题基本上是因为误解了javascript的设计导致的。

如果有本书能把js的这些槽点、另类之处,一次性说个明白就好了。还真是有,图灵就出版了一本《你不知道的javascript》。

图灵出版的这本《你不知道的javascript》上卷很特别。

enter image description here

首先,它是开放出版的作品。原作在github.com上编辑托管。截至目前,有高达31454颗Star - 当然,也包括我给的一颗。

另外,这本书还没写完,图灵只出版了第一卷。不过从内容上来说,着实值得推荐。因为它写的内容都是javascript语言的精妙乃至含混之处,稍不留神就容易跌进坑里的地方。如果你真的懂了,就能充分利用这门语言的特性和优点,在实践上发挥最大的威力。

关于javascript的贬损、夸赞等争论这里就不提了,相关的内容我还有一篇文章提到: 为什么是javascript? http://www.ituring.com.cn/article/203576

太多的人对javascript充满了不屑,认为这玩意不过是孩子的玩具,没啥好用的。但是如果你尝试着用它做个前端项目、用Node.js 做个产品试试看,也许看法就会转向另外一边了:这玩意怎么这么复杂精妙,怎么还有这么多坑!

Javascript不是玩具,除了那些公认的糟粕(未经深思熟虑的设计失误),它远比你想象的要强大。它的异步式设计、函数式编程,极度灵活又经常让人茫然,头痛不已。在你尝试着从这些泥坑中站立起来继续前进的时候,必定会产生一个念头:必须好好看看这个语言的核心要点、核心概念,才能在开发中游刃有余。业内相关的优秀图书不少,但是这本有其特色:它撇开了其它书中常见的语言介绍、语法说明等基础性的内容,直奔核心。它直接解释这门语言中的奥秘所在,以及这些设计、概念产生的各种泥坑。别人用几句话或几页纸轻描淡写而过的主题,它写了一本书。当然,这要求你有一点javascript编程体验,否则可能还是一片茫然,毫无感觉。

这部书的第一部分讲作用域和闭包。Javascript因为设计欠妥,没有块级作用域。这给很多事情带来了不少麻烦。其实一些惯用法 - 动辄用(function(){})()包裹一下,就是跟这点有关,是为了修正语言缺陷形成的。在这部分,它把相关知识解释的很明白。此外,javascript也在进步,痛定思痛,通过发布新的语言规范,遮蔽旧有的错误是很自然的需求。这里面也提到了ES6规范的补救措施和注意事项。

另外,它把js的闭包说的很明白。闭包概念,对于使用传统C/C++等编译型语言的程序员往往是一大概念障碍。因为这些语言里面根本没有这个概念。这些语言的开发者,初次看到js代码,经常会觉得十分的别扭,认为不靠谱 - 函数套函数,干嘛不分开?干嘛非得用个匿名函数?干嘛非得异步回调?如此这类问题,层出不穷。

但是真正懂得了闭包,就能看到Js中几乎无处不在,到处都是。等写几天代码,你也会习惯了。回头再看C++程序,也许反而会问:干嘛这么麻烦啊!但闭包带来的问题也不少,特别是跟作用域混合的时候,有违背直觉的地方需要留神。

此书第二部分,它像手术刀一般解析了this和对象原型。不得不再次吐槽几句,如果你有很强的面向对象开发背景,如C++。那么js的另类设计一定会让你头痛不已。因为有太多误导你的地方了。

"var a = new Foo();" 给你的第一印象是什么? 通过类创建一个新对象啊!wrong! js里面没有传统类概念。 "function speak(){ this.name = 'xxx' } this指的是谁? speak函数? wrong! 根据不同情况,答案有4种。

光这两个话题,就占据了书一半的篇幅,你想想js在这个问题上面的复杂度有多高,会给人带来多少麻烦。

那本闻名遐迩的《javascript语言精粹》提到过,this的设计有严重错误,基于原型的设计也脱离了主流程序语言的风格。这两点既给js带来了特点,也带来了麻烦。

在ES6标准中,对js的this实现有所修正,更符合思维习惯。但对基于原型的对象设计,似乎也只得如此,无可奈何了。新引入的class关键字,也只是个语法糖而已,并没有改变它基于原型的本质。

说到这里,好像一直是在责备javascript,其实这样指摘js并不公道 - 毕竟10天设计而成。它的函数式编程,非常的灵活、强大,堪称“披着C外衣的Lisp”。对于它的不足,也总能找到解决方案。强大如C++,同样有一堆的缺陷,业界还有一本名著《Imperfect c++》呢。我们对javascript扬长避短,取其精华就好了。

随着ES6标准的推进,除了使用ES6的特性,你还可以使用Typescript来编写javascript,这个出自业界大牛-C#设计者之手的语言,可以看成js的超集,能在很大程度上解决它的设计不足。可以移步:http://www.typescriptlang.org/ 一看究竟。

最后,再推荐两本图灵书,都是javascript主题。它们是学习js的好材料,内容非常全面,正好是这本js语言核心专著的良好补充。 《JavaScript编程全解》 http://www.ituring.com.cn/book/1140 《JavaScript高级程序设计(第3版)》 http://www.ituring.com.cn/book/946

这本书的中、下两册,据图灵公司透露将于8月份出版,敬请期待。