你不知道的javascript,你不知道的奧祕

威靈頓發表於2016-06-03

最近筆者使用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月份出版,敬請期待。

相關文章