如果只能推荐一本 JavaScript 的书，你会推荐哪本？
经提醒，这本书第二版已经有中文版翻译，不过回答的内容还是以原版为准。 如果你是做前端的码农，想看英文原版书，我个人推荐《Secrets of the JavaScript Ninja》，可能是因为成书时间比较晚或者是封面和书名看上去有点“中二”的原因，这本书在国内知名度不是很高。 最新的是2016年9月第二版，相较于第一版作了巨大的改动，尤其是增加了ES6 和 ES2017等内容。 我个人的经历中，这本书的第一版和第二版在3个不同时间点看过，给我的启发和指引可谓深远，至今我仍能回想起每一次看过后的心路历程，而且尤其惊人的是在工作面试时对我的帮助和作者对 JavaScript 未来发展的前瞻性。 举个例子，翻开书中第14页： 这不就是前端码农必考的题：“当你浏览器输入一个url 会发生什么？”的完整版答案吗？（14页-28页） 这个例子也是这本书神奇的地方：永远从一些具体的实际问题和工程应用入手，而不是纠结于解释太深入和晦涩的语法问题。这本书虽然只有400多页，但是包括的内容可以说是覆盖了 JavaScript 开发的方方面面，它不是红宝书那种字典形参考书，而是更多集中在 JavaScript 基础知识深入研究 + 解决工程问题的痛点上，而且他以一种独特且诙谐的方式把知识点融入到作者对忍者的热爱中。最难能可贵的是不仅全面触及了 JavaScript 的核心，例如函数的第一公民地位，函数的执行上下文，词法环境，Scope，Closure等，还加入了正则表达式，DOM，Curry 数据操作，函数化编程，代码测试等非常贴近现实开发的内容。 再举一个例子，翻开书102页： 也许你看过不少文字或者书给你解释什么叫 JavaScript 函数的执行上下文栈，但是都没有一个 chrome 浏览器截图来的直观和可操作： 下一页是讲词法环境，一页内容便把定义，使用环境，使用方式，过去和现在的改版描述的明明白白： 这本书的结构是先易后难，先基础，再扩展，所以如果你是那种喜欢从头到尾读书的，这本书挺适合入门。每个章节的开头会提到这个章节会涉及的实际问题，如果那些问题你都能回答上来，那么对照你的经验去看书中的讲解会让你收获不小。 不过值得提醒的是这本书的内容是面向有一定 JavaScript 或者编程知识的朋友，像最基本的什么叫变量，什么是 primitive data type，if else，while 循环怎么用这类知识是默认你已经熟悉了。 本书一开始就是从上诉例子中的当你输入一个url 后，浏览器会做什么开始说起，逐步涉及到 JavaScript 如何被解析，DOM 创建，Event loop等等细节。 我个人从最初几章的函数作为第一公民收益非浅，只有当你彻底理解这点，才能真正理解scope，执行上下文（Execution Context）乃至ES6的词法环境 (Lexical Environments)以及Closure，callback，这对于学习期间从C++/Java 开始接触编程的我来说尤其痛苦，JS 那堆反直觉的变量定义提升，this 根据执行环境变化经常让我混淆，正是这本书让我更快的完成了体系转变。 个人阅读本书的历程： 第一次接触是2012年刚刚毕业还在找工作的时候，被 JavaScript 的 Immediately-Invoked Function Expression （IIFE）搞得头昏脑胀，那时在网上搜索这个概念，被一个很新奇的网站一步一步教你学习IIFE 给吸引，最后才发现是 jQuery 作者 John Resig 为新入门的码农准备的一个练习，而他也把这些年对 JavaScript 深入的思考写成了后来这本书 《Secrets of the JavaScript Ninja》。工作之后，那时的前端还是jQuery 的天下，正在往库和工程化的 angular ，backbone 转换，当我一边工作一遍搜索 JavaScript 各种解决方案，系统教程时才发现这本书出版了，不过那时买来更多是囫囵吞枣，甚至都没有完整通读一遍，只是把想了解的高级技巧看一遍，照猫画虎的模仿里面的用法，但是读下来依然有一种醍醐灌顶的感觉。 第二次接触是2016年换工作，很惊喜的发现作者居然在2016年9月更新了第二版，大量的更新和架构调整，例如全面系统的讲解了 Promise 的实现，ES6的更新内容，箭头函数等，多亏这些多出来的更新章节，我也重新系统化学习了一遍ES6新功能和理解了为什么要增加这些功能，这对我那次换工作面试起到了极其重要的作用。就像所有编程语言一样，只有当你实际上手足够多的项目实践后，书上提到的那些痛点和解决办法才能引起你的共鸣，而工作了4年后再重读这本书，平时那些零散的经验方法在书中深入讲解后终于融会贯通，更多的是一种豁然开朗感。 第三次拿起是2019年换工作，我继续重复之前的习惯：把自己基本知识再夯实一遍，查漏补缺，由于之前的经验，我毫不犹豫的又拾起了这本书，这次看得更快，但是我依然不敢跳过对基本概念的复习，彼时ES6早已大量且广泛应用到前后端工作中，Babel 转译甚至都不再必须，我做的第一件事是去看作者是否有更新这本奇书，很可惜，并没有，版本依然基于2016年9月的第二版，但是第三次通读这本书，依然让我受益匪浅：而最让我惊讶的是，书中4-5年前作者写下的文字，如今正在变成面试题和工程代码： 书中146页的 Promise 实现和工程应用，现在稍稍高级一点的面试都会让你去手写个 Promise 实现。 书中158页讲解了如何用yield 和 generator 实现 async 和 await，这正是2017年才发布的ECMAScript 2017 囊括的内容，也是现在面试考察的新热点。 书中327页详细讲解了 DOM 的批量操作会引起的页面性能下降，而提到了 FastDom 的解决方案，还专门说到了 React 等库类似的 Virtual DOM 操作。 书中333页讲解的 JavaScript 事件处理的宏任务和微任务现在是核心面试的必考考题。 书中389页讲解的 Destructure 赋值，在如今React， Vue，Redux 中大行其道。 最后的附录还收录了浏览器Debug 和调试方法，这种非常接地气的做法在很多工具书上都找不到。 到了2020年，Closure 依然是初级程序员必备的题目，不过由于箭头函数，Let 等广泛应用，很少在面试题中出现了，同理，现在Apply，Call 的用途也不是面试和工作的中心了，不过这本书也同样用不小篇幅来解释和教你如何更深入的理解他们以及背后的 Scope 域。 如果真要说缺点，可能就是这本书每章后的练习题过于简单，不需要多少时间思考，也没有完全深入研究这章节的核心，所以你基本不会看到任何面试题在上面，算是个缺憾吧。 所以对于这本跨度近10年的好书，如果你是打算入门 JavaScript 或者已有经验但是希望系统性学习它和应用它，我在这里诚心推荐。