第三章:進入YDKJS

特別說明,為便于查閱,文章轉自https://github.com/getify/You-Dont-Know-JS

這個系列叢書到底是為了什么?簡單地說,它的目的是認真地學習 JavaScript的所有部分,不僅是這門語言的某些人稱之為“好的部分”的子集,也不僅是讓你在工作中搞定任務所需的最小部分的知識。

其他語言中,認真的開發者總是希望努力學習他們主要使用的語言的大部分或全部,但是JS開發者由于通常不太學習這門語言而在人群中顯得很扎眼。這不是一件好事,而且我們也不應當繼續將之視為常態。

你不懂JSYDKJS)系列的立場是與學習JS的通常方式形成鮮明的對比,而且與你將會讀到的其他JS書籍不同。它挑戰你超越自己的舒適區,對每一個你遇到的行為問一個更深入的“為什么”。你準備好接受挑戰了嗎?

我將用這最后一章的篇幅來簡要地總結一下這個系列其他書目的內容,和如何在 YDKJS 的基礎上最有效地建立學習JS的基礎。

作用域與閉包

也許你需要快速接受的基礎之一,就是在JavaScript中變量的作用域是如何工作的。關于作用域僅有傳聞中的模糊 觀念 是不夠的。

作用域與閉包 從揭穿常見的誤解開始:JS是“解釋型語言”因此是不被編譯的。不對。

JS引擎在你的代碼執行的前一刻(有時是在執行期間!)編譯它。所以我們首先深入了解編譯器處理我們代碼的方式,以此來理解它如何找到并處理變量和函數的聲明。沿著這條道路,我們將見到JS變量作用域管理的特有隱喻,“提升”。

對“詞法作用域”的極其重要的理解,是我們在這本書最后一章探索閉包時所需的基石。閉包也許是JS所有的概念中最重要的一個,但如果你沒有首先牢牢把握住作用域的工作方式,那么閉包將很可能依然不在你的掌握之中。

閉包的一個重要應用是模塊模式,正如我們在本書第二章中簡要介紹過的那樣。模塊模式也許是JavaScript的所有代碼組織模式中最流行的一種;深刻理解它應當是你的首要任務之一。

this與對象原型

也許關于JavaScript傳播得最廣泛和持久的謬誤之一是認為this關鍵字指代它所出現的函數。可怕的錯誤。

this關鍵字是根據函數如何被執行而動態綁定的,而事實上有四種簡單的規則可以用來理解和完全決定this綁定。

this密切相關的是對象原型屬性,它是一種屬性的查詢鏈,與查詢詞法作用域變量的方式相似。但是原型中包含的是另一個關于JS的巨大謬誤:模擬(山寨)類和繼承(所謂的“原型繼承”)的想法。

不幸的是,渴望將類和繼承的設計模式思想帶入JavaScript只是你能做的最差勁兒的事情,因為雖然語法可能欺騙你,使你認為有類這樣的東西存在,但實際上原型機制在行為上是根本相反的。

目前的問題是,是忽略這種錯位并假裝你實現的是“繼承”更好,還是學習并接納對象原型系統實際的工作方式更恰當。后者被稱為“行為委托”更合適。

這不光是語法上的偏好問題。委托是一種完全不同的,更強大的設計模式,其中的原因之一就是它取代了使用類和繼承進行設計的需要。但是對于以談論JavaScript的一生為主題的幾乎所有的其他博客,書籍,和論壇來說,這些斷言絕對是打臉的。

我對委托和繼承做出的宣言不是源于對語言和其語法的厭惡,而是來自于渴望看到這門語言的真實力量被正確地利用,渴望看到無盡的困惑與沮喪被一掃而光。

但是我舉出的關于原型和委托的例子可要比我在這里亂說的東西復雜得多。如果你準備好重新思考你認為你所了解的關于JavaScript“類”和“繼承”的一切,我給你一個機會來“服用紅色的藥丸”,并且看一看本系列的 this與對象原型 的第四到六章。

類型與文法

這個系列的第三本書主要集中于解決另一個極具爭議的話題:類型強制轉換。也許沒有什么話題能比你談論隱含的強制轉換造成的困惑更能使JS開發者感到沮喪了。

到目前為止,慣例的智慧說隱含強制轉換是這門語言的“壞的部分”,并且應當不計一切避免它。事實上,有些人已經到了將它稱為語言設計的“缺陷”的地步了。確實存在這么一些工具,它們的全部工作就是掃描你的代碼,并在你進行任何強制轉換,甚至是做有些像強制轉換的事情時報警。

但是強制轉換真的如此令人困惑,如此的壞,如此的不可信,以至于只要你使用它,你的代碼從一開始就滅亡了嗎?

我說不。在第一到三章中建立了對類型和值真正的工作方式的理解后,第四章參與了這個辯論,并從強制轉換的角落和縫隙全面地講解它的工作方式。我們將看到強制轉換的哪一部分真的令人驚訝,而且如果花時間去學習,哪一部分實際上完全是合理的。

但我不僅僅要說強制轉換是合理的和可以學習的,我斷言強制轉換是一種 你應當在代碼中使用的 極其有用而且完全被低估的工具。我要說在合理使用的情況下,強制轉換不僅可以工作,而且會使你的代碼更好。所有唱反調的和懷疑的人當然會嘲笑這樣的立場,但我相信它是讓你玩兒好JS游戲的主要按鍵之一。

你是想繼續人云亦云,還是想將所有的臆測放在一邊,用一個全新的視角觀察強制轉換?這個系列的 類型與文法 將會強制轉換你的想法。

異步與性能

這個系列的前三本書聚焦于這門語言的核心技術,但是第四本書稍稍開出一個分支來探討在這門語言技術之上的管理異步編程的模式。異步不僅對于性能和我們的應用程序很關鍵,而且它日漸成為改進可寫性和可維護性的關鍵因素。

這本書從搞清楚許多令人困惑的術語和概念開始,比如“異步”,“并行”和“并發”。而且深入講解了這些東西如何適用和不適用于JS。

然后我們繼續檢視作為開啟異步的主要方法:回調。但我們很快就會看到,對于現代異步編程的需求來說,單靠回調自身是遠遠不夠的。我們將找出僅使用回調編碼的兩種主要的不足之處:控制反轉(IoC)信任丟失和缺乏線性的可推理性。

為了解決這兩種主要的不足,ES6引入了兩種新的機制(實際上也是模式):promise 和 generator。

Prmise是一個“未來值”的一種與時間無關的包裝,它讓你推理并組合這些未來值而不必關心它們是否已經準備好。另外,它們通過將回調沿著一個可信賴和可組裝的promise機制傳遞,有效地解決了IoC信任問題。

Generator給JS函數引入了一種新的執行模式,generator可以在yield點被暫停而稍后異步地被繼續。這種“暫停-繼續”的能力讓generator在幕后異步地被處理,使看起來同步,順序執行的代碼成為可能。如此,我們就解決了回調的非線性,非本地跳轉的困惑,并因此使我們的異步代碼看起來是更容易推理的同步代碼。

但是,是promise與generator的組合給了我們JavaScript中最有效的異步代碼模式。事實上,在即將到來的ES7與之后的版本中,大多數精巧的異步性肯定會建立在這個基礎之上。為了認真地在一個異步的世界中高效地編程,你將需要對promise與generator的組合十分適應。

如果promise和generator是關于表達一些模式,這些模式讓你的程序更加并發地運行,而因此在更短的時間內完成更多的處理,那么JS在性能優化上就擁有許多其他的方面值得探索。

第五章鉆研的話題是使用Web Worker的程序并行性和使用SIMD的數據并行性,以及像ASM.js這樣的底層優化技術。第六章從正確的基準分析技術的角度來觀察性能優化,包括什么樣的性能值得關心而什么應當忽略。

高效地編寫JavaScript意味著編寫的代碼可以突破這種限制壁壘:在范圍廣泛的瀏覽器和其他環境中動態運行。這需要我們進行更多復雜的詳細計劃與努力,才能使一個程序從“可以工作”到“工作得很好”。

給你編寫合理且高效的JavaScript代碼所需的全部工具與技能,異步與性能 就是為此而設計的。

ES6與未來

至此,無論你感覺自己已經將JavaScript掌握的多么好,現實是JavaScript從來沒有停止過進化,而且進化的頻率正在飛快地增長。這個事實幾乎就是本系列精神的含義,擁抱我們永遠不會完全 懂得 的JS的所有部分,因為只要你掌握了它的全部,就會有你需要學習的新的東西到來。

這本書專注于這門語言在中短期的發展前景,不僅是像ES6這樣 已知的 東西,還包括在未來 可能的 東西。

雖然這個系列的所有書目采納的是在編寫它們時JavaScript的狀態,也就是ES6正在被接納的半途中,但是這個系列更主要地集中于ES5。現在我們想要將注意力轉移到ES6,ES7,和……

因為在編寫本書時ES6已經近于完成,ES6與未來 首先將ES6中確定的東西分割為幾個關鍵的范疇,包括新的語法,新的數據結構(集合),和新的處理能力以及API。我們將在各種細節的層面講解這些新的ES6特性中的每一個,包括復習我們在本系列的其他書目中遇到過的細節。

這是一些值得一讀的激動人心的ES6特性:解構,參數默認值,symbol,簡潔方法,計算屬性,箭頭函數,塊兒作用域,promise,generator,iterator,模塊,代理,weakmap,以及很多,很多別的東西!呼,ES6真是不容小覷!

這本書的第一部分是一張路線圖,為了對你將要在以后幾年中編寫和探索的新改進的JavaScript做好準備,它指明了你需要學習的所有東西。

這本書稍后的部分將注意力轉向簡要地介紹一些我們將在近未來可能看到的JavaScript的新東西。在這里最重要的是,要理解在后ES6時代,JS很可能將會一個特性一個特性地進化,而不是一個版本一個版本地進化,這意味著我們將在比你想象的早得多的時候,看到這些近未來的到來。

JavaScript的未來是光明的。這不正是我們開始學習它好時機嗎!?

復習

YDKJS 系列投身于這樣的命題:所有的JS開發者都可以,也應該學習這門偉大語言的每一部分。沒有任何個人意見,沒有任何框架的設想,沒有任何項目的期限可以作為你從沒有學習和深入理解JavaScript的借口。

我們聚焦這門語言中的每一個重要領域,為之專著一本很短但是內容非常稠密的書,來全面地探索它的 —— 你也許認為自己知道但可能并不全面 —— 所有部分。

“你不懂JS”不是一種批評或羞辱。它是我們所有人,包括我自己,都必須正視的一種現實。學習JavaScript不是一個最終目標,而是一個過程。我們還不懂JavaScript。但是我們會的!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容