你不知道的JavaScript(中卷)
上QQ阅读APP看书,第一时间看更新

前言

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的了解可能都来自那些自身就一知半解的“专家”,而这仅仅是冰山一角。读完本系列丛书后,你将真正了解这门语言。现在就让我们踏上阅读寻知之旅吧。

小结

JavaScript是一门优秀的语言。只学其中一部分内容很容易,但是要全面掌握则很难。开发人员遇到困难时往往将其归咎于语言本身,而不反省他们自己对语言的理解有多匮乏。本系列丛书旨在解决这个问题,使读者能够发自内心地喜欢上这门语言。

本书中的很多示例都假定你使用的是现代(以及未来)的JavaScript引擎环境,比如ES6。有些代码在旧版本(ES6之前)的引擎下可能不会像本书中描述的那样工作。

排版约定

本书使用了下列排版约定。

楷体

表示新术语。

• 等宽字体(constant width)

表示程序片段,以及正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等。

• 加粗等宽字体(constant width bold

表示应该由用户输入的命令或其他文本。

• 等宽斜体(constant width italic

表示应该由用户输入的值或根据上下文确定的值替换的文本。

该图标表示提示或建议。

该图标表示一般注记。

该图标表示警告或警示。

使用代码示例

补充材料(代码示例、练习等)可以从https://github.com/getify/You-Dont-Know-JS/tree/master/types%20&%20grammarhttps://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图书、培训课程、会议和新闻的信息,请访问以下网站:

http://www.oreilly.com

我们在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 Þorsteinsson、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、Barkóczi Dá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、Frédéric Harper、Ionuţ 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、Hé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、Rémy Bach、Adam Dougal、Alistair Duggin、David Loidolt、Ed Richer、Brian Chenault、GoldFire Studios、Carles André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 Mizieliński、Kees van Ginkel、Jon Abrams、Erwin Heiser、Avi Laviad、David newell、Jean-Francois Turcot、Niko Roberts、Erik Dana、Charles Neill、Aaron Holmes、Grzegorz Ziół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 Fracé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、Hernán Ciudad、Andrew Maier、Mike Stapp、Jesse Shawl、Sé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、João Paulo Dubas、James Taylor、Philipp Kraeutli、Mihai Paˇun、Sam Gharegozlou、joshjs、Matt Murchison、Eric Windham、Timo Behrmann、Andrew Hall、joshua price、Théophile Villard。

这套系列丛书的写作、编辑和制作都是以开源的方式进行的。我们要感谢GitHub让这一切成为可能!

再次向我没能提及的支持者们表示感谢。这套系列丛书属于我们每一个人,希望它能够帮助更多的人更好地了解JavaScript,让当前和未来的社区贡献者受益。