很多人對JavaScript這門語言的印象都是簡單易學,很容易上手。雖然JavaScript語言本身有很多復雜的概念,但語言的使用者不必深入理解這些概念就可以編寫出功能全面的應(yīng)用。殊不知,這些復雜精妙的概念才是語言的精髓,即使是經(jīng)驗豐富的JavaScript開發(fā)人員,如果沒有認真學習的話也法真正理解它們。在《圖靈程序設(shè)計叢書:你不知道的JavaScript(上卷)》中,我們要直面當前JavaScript開發(fā)者“不求甚解”的大趨勢,深入理解語言內(nèi)部的機制。
《圖靈程序設(shè)計叢書:你不知道的JavaScript(上卷)》既適合JavaScript語言初學者閱讀,又適合經(jīng)驗豐富的JavaScript開發(fā)人員深入學習。
JavaScript語言有很多復雜的概念,但卻用簡單的方式體現(xiàn)出來(比如回調(diào)函數(shù)),因此,JavaScript開發(fā)者無需理解語言內(nèi)部的原理,就能編寫出功能全面的程序;就像收音機一樣,你無需理解里面的管子和線圈都是做什么用的,只要會操作收音機上的按鍵,就可以收聽你喜歡的節(jié)目。然而,JavaScript的這些復雜精妙的概念才是語言的精髓,即使是經(jīng)驗豐富的JavaScript開發(fā)者,如果沒有認真學習也無法真正理解語言本身的特性。正是因為絕大多數(shù)人不求甚解,一遇到出乎意料的行為就認為是語言本身有缺陷,進而把相關(guān)的特性加入黑名單,久而久之就排除了這門語言的多樣性,人為地使它變得不完整、不安全。
“你不知道的JavaScript”系列就是要讓不求甚解的JavaScript開發(fā)者迎難而上,深入語言內(nèi)部,弄清楚JavaScript每一個零部件的用途。本書介紹了該系列的兩個主題:“作用域和閉包”以及“this和對象原型”。掌握了這些知識之后,無論什么技術(shù)、框架和流行詞語,你都能輕松理解。
在互聯(lián)網(wǎng)發(fā)展的早期,JavaScript 就已經(jīng)成為了支撐網(wǎng)頁內(nèi)容交互體驗的基礎(chǔ)技術(shù)。那時JavaScript 的作用可能僅僅是生成一些閃爍的鼠標軌跡或者煩人的彈出窗口,但是經(jīng)過了大約20 年的發(fā)展,JavaScript 的技術(shù)和能力都發(fā)生了天翻地覆的變化,現(xiàn)在的JavaScript 毫無疑問已經(jīng)成為了世界上使用范圍最廣的軟件平臺——互聯(lián)網(wǎng)——的核心技術(shù)。
但是作為一個語言來說,它總是成為大家批評的對象,部分原因是它有很多歷史遺留問題,但主要原因是它的設(shè)計哲學有問題。就像Brendan Eich 曾經(jīng)說過的,JavaScript 甚至連名字都給人一種“蠢弟弟”的感覺,就像是它更成熟的大哥Java 的不完整版本。不過名字只不過是營銷策略上的一個意外,這兩個語言有許多本質(zhì)上的區(qū)別。JavaScript 和Java 的關(guān)系,就像Carnival(嘉年華)和Car(汽車)的關(guān)系一樣,八竿子打不著。
JavaScript 借鑒了許多語言的概念和語法,比如C 風格的過程式編程以及不太明顯的Scheme/List 風格的函數(shù)式編程,因此吸引了許多開發(fā)者,甚至是那些不會編程的新手。用JavaScript 來編寫“Hello World”是非常簡單的,因此這門語言很有吸引力并且很好上手。
雖然JavaScript 可能是最早出現(xiàn)的語言之一,但是由于其本身的特殊性,相比其他語言,能真正掌握JavaScript 的人比較少。如果想用C、C++ 這樣的語言編寫功能全面的程序,那需要對語言有很深的了解。但是對于JavaScript 來說,編寫功能全面的程序僅僅是冰山一角。
JavaScript 語言本質(zhì)上有許多復雜的概念,但是卻用一種看起來比較簡單的方式體現(xiàn)出來, 比如回調(diào)函數(shù),因此JavaScript 開發(fā)者通常只是簡單地使用這些特性,并不會關(guān)心語言內(nèi)部的實現(xiàn)原理。
JavaScript 既是一門充滿吸引力、簡單易用的語言,又是一門具有許多復雜微妙技術(shù)的語言,即使是經(jīng)驗豐富的JavaScript 開發(fā)者,如果沒有認真學習的話也無法真正理解它們。
這就是JavaScript 的矛盾之處,也是這門語言的阿喀琉斯之踵。由于JavaScript 不必理解就可以使用,因此通常來說很難真正理解語言本身,這就是我們面臨的挑戰(zhàn)。
使命
如果每次遇到JavaScript 中出乎意料的行為時,你的反應(yīng)就是把它加入黑名單(很多人都是這么做的),那用不了多久你就會把JavaScript 語言真正的多樣性全部排除。
剩下的部分就是非常著名的“好的部分”(Good Parts),但是親愛的讀者們,我懇請你們把它稱作“簡單的部分”、“安全的部分”甚至“不完整的部分”。
“你不知道的JavaScript”系列叢書要做的事恰好相反:學習并且深入理解整個JavaScript, 尤其是那些“難的部分”。
在本書中,我們要直面當前JavaScript 開發(fā)者不求甚解的大趨勢,他們往往不會深入理解語言內(nèi)部的機制,遇到困難就會退縮。我們要做的恰好相反,不是退縮,而是繼續(xù)前進。
你們應(yīng)當像我一樣,不滿足于只是讓代碼正常工作,而是想要弄清楚“為什么”。我希望你能勇于挑戰(zhàn)這條崎嶇顛簸的“少有人走的路”,擁抱整個JavaScript。掌握了這些知識之后,無論什么技術(shù)、框架和流行詞語你都能輕松理解。
這個系列中的每本書專注于語言中一個最容易被誤解或者最難理解的核心部分,進行深入、詳盡的介紹。在閱讀本書時,你應(yīng)當審視自己對于JavaScript 的理解,仔細思考書中講解的理論和那些“你需要知道”的東西。
現(xiàn)在你所理解的JavaScript 很可能是從別人那里學來的不完整版。這樣的JavaScript 只是真正的JavaScript 的影子。學完這個系列之后,你就會掌握真正的JavaScript。讀下去吧,我的朋友,JavaScript 恭候你的光臨。
小結(jié)
JavaScript 非常特殊,只學一部分的話非常簡單,但是想要完整地學習會很難(就算學到夠用也不容易)。當開發(fā)者感到迷惑時,他們通常會責怪語言本身,而不是怪自己對語言缺乏了解。這個系列就是為了解決這個問題,讓你打心眼兒里欣賞這門語言。
Kyle Simpson,推崇開放的互聯(lián)網(wǎng),對JavaScript、HTML5、實時/端對端通信和Web性能有深入研究。他是技術(shù)書作家、技術(shù)培訓師、講師和開源社區(qū)的活躍成員。
前言
第一部分 作用域和閉包
序
第1章 作用域是什么
1.1 編譯原理
1.2 理解作用域
1.2.1 演員表
1.2.2 對話
1.2.3 編譯器有話說
1.2.4 引擎和作用域的對話
1.2.5 小測驗
1.3 作用域嵌套
1.4 異常
1.5 小結(jié)
第2章 詞法作用域
2.1 詞法階段
2.2 欺騙詞法
2.2.1 eval
2.2.2 with
2.2.3 性能
2.3 小結(jié)
第3章 函數(shù)作用域和塊作用域
3.1 函數(shù)中的作用域
3.2 隱藏內(nèi)部實現(xiàn)
3.3 函數(shù)作用域
3.3.1 匿名和具名
3.3.2 立即執(zhí)行函數(shù)表達式
3.4 塊作用域
3.4.1 with
3.4.2 try/catch
3.4.3 let
3.4.4 const
3.5 小結(jié)
第4章 提升
4.1 先有雞還是先有蛋
4.2 編譯器再度來襲
4.3 函數(shù)優(yōu)先
4.4 小結(jié)
第5章 作用域閉包
5.1 啟示
5.2 實質(zhì)問題
5.3 現(xiàn)在我懂了
5.4 循環(huán)和閉包
5.5 模塊
5.5.1 現(xiàn)代的模塊機制
5.5.2 未來的模塊機制
5.6 小結(jié)
附錄A 動態(tài)作用域
附錄B 塊作用域的替代方案
附錄C this詞法
附錄D 致謝
第二部分 this和對象原型
序
第1章 關(guān)于this
……