- 你不知道的JavaScript(中卷)
- (美)凱爾·辛普森
- 4425字
- 2019-01-05 10:14:48
前言
JavaScript從互聯網萌芽時期開始就一直是實現交互體驗的基本技術。雖然最初被用來實現閃爍的鼠標軌跡和煩人的彈出消息框,但在大約二十年以后,它在技術和功能方面都得到了很大的提升,幾乎沒有人再質疑它在互聯網中的重要地位。
但是,作為一門編程語言,JavaScript一直為人詬病,部分原因是其歷史沿革,更重要的原因則是其設計理念。因為JavaScript這個名字,Brendan Eich曾戲稱它為“傻小弟”(相對于成熟的Java而言)。實際上,這個名字完全是政治和市場考量下的產物。兩門語言之間千差萬別,“JavaScript”之于“Java”就如同“Carnival”(嘉年華)之于“Car”(汽車)一樣,兩者之間并無半點關系。
JavaScript在概念和語法風格上借鑒了其他編程語言,包括C風格的過程式編程和隱晦的Scheme/Lisp風格的函數式編程,這使得它能為不同背景的開發人員所接受,包括那些沒有多少編程經驗的人。用JavaScript編寫一個“Hello World”程序非常簡單。
JavaScript可能是最容易上手的編程語言之一,但它的一些奇特之處使得它不像其他語言那樣容易完全掌握。要想用C或者C++開發一個完整的應用程序,開發者需要對該門語言有相當深入的了解。然而對于JavaScript,即使我們用它開發了一個完整的系統也不見得就能深入理解它。
這門語言中有些復雜的概念隱藏得很深,卻常常以一種看似簡單的形式呈現。例如,將函數作為回調函數傳遞,這讓JavaScript開發人員往往滿足于使用這些現成便利的機制,而不愿去探究其中的原理。
JavaScript是一門簡單易用的語言,應用廣泛,同時它的語言機制又十分復雜和微妙,即使經驗豐富的開發人員也需要用心學習才能真正掌握。
JavaScript的矛盾之處就在于此,它的阿喀琉斯之踵正是本書要解決的問題。因為無需深入理解就能用它來編程,所以人們常常放松對它的學習。
使命
在學習JavaScript的過程中,碰到令人抓狂的問題或挫折時,如果置之不理或不求甚解(就像有些人習慣做的那樣),我們很快就會發現自己根本無從發揮這門語言的威力。
盡管這些被稱為JavaScript的“精華”部分,但我懇請讀者朋友們將其看作“容易的”“安全的” 或者“不完整的”部分。
“你不知道的JavaScript”系列叢書旨在介紹JavaScript的另一面,讓你深入掌握JavaScript的全部,特別是那些難點。
JavaScript開發人員常常滿足于一知半解,不愿更深入地了解其深層原因和運作方式,本書要解決的正是這個問題。我們會直面那些疑難困惑,絕不回避。
我個人不會僅僅滿足于讓代碼運行起來而不明就里,你也應該這樣。本書中,我會逐步介紹JavaScript中那些不太為人所知的地方,最終讓你對這門語言有一個全面的了解。一旦掌握了這些知識,那些技巧、框架和時髦術語等都將不在話下。
本系列叢書全面深入地介紹了JavaScript中常為人誤解和忽視的重要知識點,讓你在讀完之后不論從理論上還是實踐上都能對這門語言有足夠的信心。
目前你對JavaScript的了解可能都來自那些自身就一知半解的“專家”,而這僅僅是冰山一角。讀完本系列叢書后,你將真正了解這門語言?,F在就讓我們踏上閱讀尋知之旅吧。
小結
JavaScript是一門優秀的語言。只學其中一部分內容很容易,但是要全面掌握則很難。開發人員遇到困難時往往將其歸咎于語言本身,而不反省他們自己對語言的理解有多匱乏。本系列叢書旨在解決這個問題,使讀者能夠發自內心地喜歡上這門語言。
本書中的很多示例都假定你使用的是現代(以及未來)的JavaScript引擎環境,比如ES6。有些代碼在舊版本(ES6之前)的引擎下可能不會像本書中描述的那樣工作。
排版約定
本書使用了下列排版約定。
? 楷體
表示新術語。
? 等寬字體(constant width)
表示程序片段,以及正文中出現的變量、函數名、數據庫、數據類型、環境變量、語句和關鍵字等。
? 加粗等寬字體(constant width bold)
表示應該由用戶輸入的命令或其他文本。
? 等寬斜體(constant width italic)
表示應該由用戶輸入的值或根據上下文確定的值替換的文本。
該圖標表示提示或建議。
該圖標表示一般注記。
該圖標表示警告或警示。
使用代碼示例
補充材料(代碼示例、練習等)可以從https://github.com/getify/You-Dont-Know-JS/tree/master/types%20&%20grammar和https://github.com/getify/You-Dont-Know-JS/tree/master/async&performance下載。
本書是要幫你完成工作的。一般來說,如果本書提供了示例代碼,你可以把它用在你的程序或文檔中。除非你使用了很大一部分代碼,否則無需聯系我們獲得許可。比如,用本書的幾個代碼片段寫一個程序就無需獲得許可,銷售或分發O'Reilly圖書的示例光盤則需要獲得許可;引用本書中的示例代碼回答問題無需獲得許可,將書中大量的代碼放到你的產品文檔中則需要獲得許可。
我們很希望但并不強制要求你在引用本書內容時加上引用說明。引用說明一般包括書名、作者、出版社和ISBN,比如:“You Don't Know JavaScript:Types&Grammar by Kyle Simpson (O'Reilly). Copyright 2015 Getify Solutions, Inc., 978-1-491-90419-0”。
如果你覺得自己對示例代碼的用法超出了上述許可的范圍,歡迎你通過permissions@oreilly.com與我們聯系。
Safari? Books Online

Safari Books Online(http://www.safaribooksonline.com)是 應運而生的數字圖書館。它同時以圖書和視頻的形式出版世界頂級技術和商務作家的專業作品。技術專家、軟件開發人員、Web設計師、商務人士和創意專家等,在開展調研、解決問題、學習和認證培訓時,都將Safari Books Online視作獲取資料的首選渠道。
對于組織團體、政府機構和個人,Safari Books Online提供各種產品組合和靈活的定價策略。用戶可通過一個功能完備的數據庫檢索系統訪問O'Reilly Media、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology以及其他幾十家出版社的上千種圖書、培訓視頻和正式出版之前的書稿。要了解Safari Books Online的更多信息,我們網上見。
聯系我們
請把對本書的評價和問題發給出版社。
美國:
O'Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區西直門南大街2號成銘大廈C座807室(100035)
奧萊利技術咨詢(北京)有限公司
O'Reilly的每一本書都有專屬網頁,你可以在那兒找到本書的相關信息,包括勘誤表、示例代碼以及其他信息。本書第一部分“類型和語法”的網站地址是http://shop.oreilly.com/product/0636920033745.do。本書第二部分“異步和性能”的網址是http://shop.oreilly.com/product/0636920033752.do。
對于本書的評論和技術性問題,請發送電子郵件到:
bookquestions@oreilly.com
要了解更多O'Reilly圖書、培訓課程、會議和新聞的信息,請訪問以下網站:
我們在Facebook的地址:http://facebook.com/oreilly
請關注我們的Twitter動態:http://twitter.com/oreillymedia
我們的YouTube視頻地址:http://www.youtube.com/oreillymedia
致謝
我要感謝很多人,是他們的幫助讓本書以及整個系列得以出版。
首先,我要感謝我的妻子Christen Simpson以及我的兩個孩子Ethan和Emily,容忍我整天坐在電腦前工作。即使不寫作的時候,我的眼睛也總是盯著屏幕做一些與JavaScript相關的工作。我犧牲了很多陪伴家人的時間,這個系列的叢書才得以為讀者深入全面地介紹JavaScript。對于家庭,我虧欠太多。
我要感謝O'Reilly的編輯Simon St.Laurent和Brian MacDonald,以及所有其他的編輯和市場工作人員。和他們一起工作非常愉快;本系列叢書的寫作、編輯和制作都以開源方式進行,在此實驗過程中,他們給予了非常多的幫助。
我要感謝所有為本系列叢書提供建議和校正的人,包括Shelley Powers、Tim Ferro、Evan Borden、Forrest L. Norvell、Jennifer Davis、Jesse Harlin等。十分感謝David Walsh和Jake Archibald為本書作序。
我要感謝JavaScript社區中的許多人,包括TC39委員會的成員們,將他們的知識與我們分享,并且耐心詳盡地回答我無休止的提問。他們是John-David Dalton、Juriy“kangax”Zaytsev、Mathias Bynens、Rick Waldron、Axel Rauschmayer、Nicholas Zakas、Angus Croll、Jordan Harband、Reginald Braithwaite、Dave Herman、Brendan Eich、Allen Wirfs-Brock、Bradley Meck、Domenic Denicola、David Walsh、Tim Disney、Kris Kowal、Peter van der Zee、Andrea Giammarchi、Kit Cambridge,等等。還有很多人,我無法一一感謝。
“你不知道的JavaScript”系列叢書是由Kickstarter發起的,我要感謝近500名慷慨的支持者,沒有他們的支持就沒有這套系列叢書:
Jan Szpila、nokiko、Murali Krishnamoorthy、Ryan Joy、Craig Patchett、pdqtrader、Dale Fukami、ray hatfield、R0drigo Perez [Mx]、Dan Petitt、Jack Franklin、Andrew Berry、Brian Grinstead、Rob Sutherland、Sergi Meseguer、Phillip Gourley、Mark Watson、Jeff Carouth、Alfredo Sumaran、Martin Sachse、Marcio Barrios、Dan、AimelyneM、Matt Sullivan、Delnatte Pierre-Antoine、Jake Smith、Eugen Tudorancea、Iris、David Trinh、simonstl、Ray Daly、Uros Gruber、Justin Myers、Shai Zonis、Mom & Dad、Devin Clark、Dennis Palmer、Brian Panahi Johnson、Josh Marshall、Marshall、Dennis Kerr、Matt Steele、Erik Slagter、Sacah、Justin Rainbow、Christian Nilsson、Delapouite、D.Pereira、Nicolas Hoizey、George V. Reilly、Dan Reeves、Bruno Laturner、Chad Jennings、Shane King、Jeremiah Lee Cohick、od3n、Stan Yamane、Marko Vucinic、Jim B、Stephen Collins、?gir Torsteinsson、Eric Pederson、Owain、Nathan Smith、Jeanetteurphy、Alexandre ELISé?、Chris Peterson、Rik Watson、Luke Matthews、Justin Lowery、Morten Nielsen、Vernon Kesner、Chetan Shenoy、Paul Tregoing、Marc Grabanski、Dion Almaer、Andrew Sullivan、Keith Elsass、Tom Burke、Brian Ashenfelter、David Stuart、Karl Swedberg、Graeme、Brandon Hays、John Christopher、Gior、manoj reddy、Chad Smith、Jared Harbour、Minoru TODA、Chris Wigley、Daniel Mee、Mike、Handyface、Alex Jahraus、Carl Furrow、Rob Foulkrod、Max Shishkin、Leigh Penny Jr.、Robert Ferguson、Mike van Hoenselaar、Hasse Schougaard、rajan venkataguru、Jeff Adams、Trae Robbins、Rolf Langenhuijzen、Jorge Antunes、Alex Koloskov、Hugh Greenish、Tim Jones、Jose Ochoa、Michael Brennan-White、Naga Harish Muvva、Barko?czi Da?vid、Kitt Hodsden、Paul McGraw、Sascha Goldhofer、Andrew Metcalf、Markus Krogh、Michael Mathews、Matt Jared、Juanfran、Georgie Kirschner、Kenny Lee、Ted Zhang、Amit Pahwa、Inbal Sinai、Dan Raine、Schabse Laks、Michael Tervoort、Alexandre Abreu、Alan Joseph Williams、NicolasD、Cindy Wong、Reg Braithwaite、LocalPCGuy、Jon Friskics、Chris Merriman、John Pena、Jacob Katz、Sue Lockwood、Magnus Johansson、Jeremy Crapsey、Grzegorz Paw?owski、nico nuzzaci、Christine Wilks、Hans Bergren、charles montgomery、Ariel Fogel、Ivan Kolev、Daniel Campos、Hugh Wood、Christian Bradford、Fre?de?ric Harper、Ionut? Dan Popa、Jeff Trimble、Rupert Wood、Trey Carrico、Pancho Lopez、Joe‥l kuijten、Tom A Marra、Jeff Jewiss、Jacob Rios、Paolo Di Stefano、Soledad Penades、Chris Gerber、Andrey Dolganov、Wil Moore III、Thomas Martineau、Kareem、Ben Thouret、Udi Nir、Morgan Laupies、jory carson-burson、Nathan L Smith、Eric Damon Walters、Derry Lozano-Hoyland、Geoffrey Wiseman、mkeehner、KatieK、Scott MacFarlane、Brian LaShomb、Adrien Mas、christopher ross、Ian Littman、Dan Atkinson、Elliot Jobe、Nick Dozier、Peter Wooley、John Hoover、dan、Martin A. Jackson、He?ctor Fernando Hurtado、andy ennamorato、Paul Seltmann、Melissa Gore、Dave Pollard、Jack Smith、Philip Da Silva、Guy Israeli、@megalithic、Damian Crawford、Felix Gliesche、April Carter Grant、Heidi、jim tierney、Andrea Giammarchi、Nico Vignola、Don Jones、Chris Hartjes、Alex Howes、john gibbon、David J. Groom、BBox、Yu Dilys Sun、Nate Steiner、Brandon Satrom、Brian Wyant、Wesley Hales、Ian Pouncey、Timothy Kevin Oxley、George Terezakis、sanjay raj、Jordan Harband、Marko McLion、Wolfgang Kaufmann、Pascal Peuckert、Dave Nugent、Markus Liebelt、Welling Guzman、Nick Cooley、Daniel Mesquita、Robert Syvarth、Chris Coyier、Re?my Bach、Adam Dougal、Alistair Duggin、David Loidolt、Ed Richer、Brian Chenault、GoldFire Studios、Carles Andre?s、Carlos Cabo、Yuya Saito、roberto ricardo、Barnett Klane、Mike Moore、Kevin Marx、Justin Love、Joe Taylor、Paul Dijou、Michael Kohler、Rob Cassie、Mike Tierney、Cody Leroy Lindley、tofuji、Shimon Schwartz、Raymond、Luc De Brouwer、David Hayes、Rhys Brett-Bowen、Dmitry、Aziz Khoury、Dean、Scott Tolinski - Level Up、Clement Boirie、Djordje Lukic、Anton Kotenko、Rafael Corral、Philip Hurwitz、Jonathan Pidgeon、Jason Campbell、Joseph C.、SwiftOne、Jan Hohner、Derick Bailey、getify、Daniel Cousineau、Chris Charlton、Eric Turner、David Turner、Joe‥l Galeran、Dharma Vagabond、adam、Dirk van Bergen、dave
furf、Vedran Zakanj、Ryan McAllen、Natalie Patrice Tucker、Eric J. Bivona、Adam Spooner、Aaron Cavano、Kelly Packer、Eric J、Martin Drenovac、Emilis、Michael Pelikan、Scott F. Walter、Josh Freeman、Brandon Hudgeons、vijay chennupati、Bill Glennon、Robin R.、Troy Forster、otaku coder、Brad、Scott、Frederick Ostrander、Adam Brill、Seb Flippence、Michael Anderson、Jacob、Adam Randlett、Standard、Joshua Clanton、Sebastian Kouba、Chris Deck、SwordFire、Hannes Papenberg、Richard Woeber、hnzz、Rob Crowther、Jedidiah Broadbent、Sergey Chernyshev、Jay-Ar Jamon、Ben Combee、luciano bonachela、Mark Tomlinson、Kit Cambridge、Michael Melgares、Jacob Adams、Adrian Bruinhout、Bev Wieber、Scott Puleo、Thomas Herzog、April Leone、Daniel Mizielin?ski、Kees van Ginkel、Jon Abrams、Erwin Heiser、Avi Laviad、David newell、Jean-Francois Turcot、Niko Roberts、Erik Dana、Charles Neill、Aaron Holmes、Grzegorz Zio??kowski、Nathan Youngman、Timothy、Jacob Mather、Michael Allan、Mohit Seth、Ryan Ewing、Benjamin Van Treese、Marcelo Santos、Denis Wolf、Phil Keys、Chris Yung、Timo Tijhof、Martin Lekvall、Agendine、Greg Whitworth、Helen Humphrey、Dougal Campbell、Johannes Harth、Bruno Girin、Brian Hough、Darren Newton、Craig McPheat、Olivier Tille、Dennis Roethig、Mathias Bynens、Brendan Stromberger、sundeep、John Meyer、Ron Male、John F Croston III、gigante、Carl Bergenhem、B.J. May、Rebekah Tyler、Ted Foxberry、Jordan Reese、Terry Suitor、afeliz、Tom Kiefer、Darragh Duffy、Kevin Vanderbeken、Andy Pearson、Simon Mac Donald、Abid Din、Chris Joel、Tomas Theunissen、David Dick、Paul Grock、Brandon Wood、John Weis、dgrebb、Nick Jenkins、Chuck Lane、Johnny Megahan、marzsman、Tatu Tamminen、Geoffrey Knauth、Alexander Tarmolov、Jeremy Tymes、Chad Auld、Sean Parmelee、Rob Staenke、Dan Bender、Yannick derwa、Joshua Jones、Geert Plaisier、Tom LeZotte、Christen Simpson、Stefan Bruvik、Justin Falcone、Carlos Santana、Michael Weiss、Pablo Villoslada、Peter deHaan、Dimitris Iliopoulos、seyDoggy、Adam Jordens、Noah Kantrowitz、Amol M、Matthew Winnard、Dirk Ginader、Phinam Bui、David Rapson、Andrew Baxter、Florian Bougel、Michael George、Alban Escalier、Daniel Sellers、Sasha Rudan、John Green、Robert Kowalski、David I. Teixeira (@ditma、Charles Carpenter、Justin Yost、Sam S、Denis Ciccale、Kevin Sheurs、Yannick Croissant、Pau Frace?s、Stephen McGowan、Shawn Searcy、Chris Ruppel、Kevin Lamping、Jessica Campbell、Christopher Schmitt、Sablons、Jonathan Reisdorf、Bunni Gek、Teddy Huff、Michael Mullany、Michael Fu‥rstenberg、Carl Henderson、Rick Yoesting、Scott Nichols、Herna?n Ciudad、Andrew Maier、Mike Stapp、Jesse Shawl、Se?rgio Lopes、jsulak、Shawn Price、Joel Clermont、Chris Ridmann、Sean Timm、Jason Finch、Aiden Montgomery、Elijah Manor、Derek Gathright、Jesse Harlin、Dillon Curry、Courtney Myers、Diego Cadenas、Arne de Bree、Joa?o Paulo Dubas、James Taylor、Philipp Kraeutli、Mihai Paˇun、Sam Gharegozlou、joshjs、Matt Murchison、Eric Windham、Timo Behrmann、Andrew Hall、joshua price、The?ophile Villard。
這套系列叢書的寫作、編輯和制作都是以開源的方式進行的。我們要感謝GitHub讓這一切成為可能!
再次向我沒能提及的支持者們表示感謝。這套系列叢書屬于我們每一個人,希望它能夠幫助更多的人更好地了解JavaScript,讓當前和未來的社區貢獻者受益。
- C#高級編程(第10版) C# 6 & .NET Core 1.0 (.NET開發經典名著)
- Visual C++程序設計教程
- HBase從入門到實戰
- R語言游戲數據分析與挖掘
- 自然語言處理Python進階
- Tableau 10 Bootcamp
- AIRIOT物聯網平臺開發框架應用與實戰
- MINECRAFT編程:使用Python語言玩轉我的世界
- JBoss:Developer's Guide
- 零基礎學Scratch 3.0編程
- jQuery for Designers Beginner's Guide Second Edition
- INSTANT JQuery Flot Visual Data Analysis
- SQL Server 2012 數據庫應用教程(第3版)
- Yii2 By Example
- Vue.js 3.x高效前端開發(視頻教學版)