序言
我確信你已經注意到,雖然謾罵JavaScript這門語言的怪癖可能是我們的共識,但是書名中的JS并不是什么詛咒JavaScript的縮寫。
在web早期, JavaScript是驅動我們和內容交互的一項基本技術。閃爍的鼠標痕跡和煩人的彈出框大概是 JavaScript的七點,在將近20年后的今天, JavaScript的技術和能力有了長足的進步,沒有人再懷疑它對于世界上最廣泛應用的軟件平臺心臟web的重要性。
但是JavaScript作為一門語言,人們無休止的評論它,一方面由于它的后遺癥,更重要的是它的設計哲學。正如Brendan Eich曾經說的,從它的名字可以看出,相比于成熟的大哥哥Java,它只是一個不愿說話的小弟弟。但是它的名字只不過是市場營銷的一個意外。這兩門語言有很大的不同,"JavaScript"相比于"Java"正如"Carnival"相比于"Car".
由于JavaScript從一些語言借鑒了很多概念和語法,包括(實在不會翻譯,請諒解!proud C-style procedural roots as well as subtle, less obvious Scheme/Lisp-style functional roots)。對于絕大多數開發者甚至沒有編程經驗的的人,JavaScript都非常和藹可親。在早期學習中,JavaScript版的"Hello World"是如此的簡單,讓人可以很容易上手。
雖然JavaScript可能是啟動和運行的最簡單的語言之一,但是它的一些怪癖使得它并不如一些語言一樣容易精通。就像C或者C++語言一樣,用JavaScript寫一個完整的程序完整的產品需要有非常深入的知識,只是蜻蜓點水是不行的。
一些成熟的概念深深地植根于這門語言中,比如傳遞一些函數當做回調,鼓勵 JavaScript開發者放心使用而不用關心內部的實現。它即使一門簡單的容易使用的語言,同時又有復雜的細微差別的語法,如果不注意仔細學習,并能真正掌握。
在JavaScript中有個悖論,就像這門語言的阿基里斯之踵,我們都要面對的問題。由于JavaScript可以在不用理解的情況下使用,那么我們可能并不會去理解它。
任務
如果在JavaScript中你遇到了意料之外的或者令人沮喪的東西,你的反應是將它列入黑名單。久而久之,JavaScript的寶藏對于你來說只是一個空殼。
JavaScript的好的部分十分著名("The Good Parts"),我會懇求你,親愛的讀者,不要老想著簡單的部分,安全的部分或者不完整的部分。這個You Don't Know JavaScript系列提出了一個相反的挑戰,學習并且深入理解JavaScript的全部,甚至并且特別是艱難的部分。
在這里,我們傾向于讓JS開發者學會剛剛好的知識,并不是強迫他們弄清楚語言行為背后的怎樣以及為什么。同事,我們盡量避免讓他們在學習變得困難時去放棄。
我沒有說,你們也不應該僅僅停留在一些東西能夠工作,并不真正知道為什么能夠工作。我希望溫柔地挑戰你們,在崎嶇不平的路上進行一段旅程,走過"少有人走過的路",擁抱JavaScript的方方面面。不需要技術和框架,不需要花里胡哨的語言,這些知識將拓展你的知識體系。
這系列書中的每一本都會介紹這門語言的一個核心主題,并且全面徹底地深入其中。這些主題常常被人誤解或者理解不夠。你在讀這些書時,不要受制于自己的已有知識,不要先入為主,同時不要只停留在理論層面上,要多多練習。
你當前所知的JavaScript可能只是本身就一知半解的人教給你的一部分,這只是真實JavaScript的影子。你還沒真正理解JavaScript,但是如果你深入本系列書籍,你將會理解。讀起來,我的朋友。JavaScript等著你。
總結
JavaScript是令人驚嘆的。學習它的一部分是容易的,但學習完整是比較困難的。當開發者們遭遇困惑,他們常常歸咎于語言的本身,而不是自身理解的缺乏。這些書旨在修正這一點,會激起你對于這門語言極大的興趣,而這些內容正是你應該深入去理解的。
注釋:這本書中的很多例子假定運行在現代JavaScript引擎環境,比如 ES6。其中一寫代碼可能在一些老的引擎(pre-ES6)不能工作。