> For the complete documentation index, see [llms.txt](https://gaoge011022.gitbook.io/snowflyts-bookshelf/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gaoge011022.gitbook.io/snowflyts-bookshelf/youdontknowjs-ni-bu-zhi-dao-de-javascript-shang-juan.md).

# You Don't Know JS - 你不知道的JavaScript（上卷）

## 图书信息

* 英文书名：You Don't Know JS: Scope & Closures & This & Object & Protoypes
* 中文书名：你不知道的 JavaScript（上卷）
* 作者：\[美] Kyle Simpson
* 译者：赵望野 / 梁杰
* 页数：正文 188 页 / 附录 7 页
* 英文出版社：O'Reilly Media
* 中文出版社：人民邮电出版社 / 图灵教育
* 出版日期：英文原版 2014 / 简体中文版 2015
* 个人分类：前端 / JavaScript
* ISBN：978-7-115-38573-4

## 书评

写于2022年4月1日。

本书并不厚，不到两百页的篇幅使其阅读起来并不会有什么压力。虽然出版于2014年，但是勉强赶上了ES6时代，因此也不算太过时。

书的内容在副标题中写得很清楚了“Scope & Closures & This & Object & Protoypes”，翻译过来就是“作用域、闭包、This、对象以及原型”，而这些基本就是JS中最令人困惑的那些特性了（ES6出现之前，现在得把Promise和Proxy这些加上）。

《你不知道的JavaScript（上卷）》实际上是两本书的合集。第一部分讲词法作用域和闭包，很有趣，也带人了解了解释器是怎样工作的，讲闭包那部分也很有用（虽然对我好像没什么帮助）。不过第一部分用很大的篇幅分析了var造成的诸多迷惑特性，这个倒确实过时了，我想不出有任何理由在现代JS代码里使用var。当然，了解历史终归是有点帮助的，不过意义不是很大就是了。

第二部分就有些神奇了，除开我本来就很清楚的原型链，其关于this和继承模式的讲解可谓是醍醐灌顶，最大的收获应当是对this的动态绑定有了一个比较清楚的认识。this的确是一个很让人困惑的特性，但它同时也是许多库之所以能够实现很多魔法的原因，而this的存在造就了JS无与伦比的动态性。JS最关键的是不要把Java等传统面向对象语言的类继承思想带到JS，而是要抛弃“类继承”，转而以对象和连接去思考。

作者在书中对“类继承”进行了抨击，指出在JS中使用类继承是很愚蠢的行为。于是作者提出了“OLOO”模式，试图以委托代替继承。OLOO模式看起来是很好的，也很符合原型继承思想，更契合JS的本质。然而按照我个人的见解，这似乎没有解决本质上的问题，而且确确实实导致代码变得更繁琐了，我很难想象在存在new关键字的情况有什么不使用new的理由。另外OLOO本质上就是另一种混入，严重降低了代码的内聚性，很多时候这并不是一个好主意。

作者在写作的时候估计也没想到class在这些年里确确实实地使难以计数的项目收益。而且随着TC39委员会的持续推进，JS的class正变得越来越接近于真正的“类”。事实上，现在将class称作是一个“语法糖”并不妥当。class目前的实现机制已经变得非常复杂，几乎完全屏蔽了对prototype的操作，在静态方法、类属性和私有属性/方法加入后（ES2022）已经和大多数主流语言中的class没什么区别了。class的确惠及了太多人，似乎已经没有反对class的理由了。当然，如果当时另辟蹊径选择尝试另一种更加JS的方式实现更好的面向对象，也许会更好。

除开由于出版年份较早而带来的一部分内容稍微过时的问题，和作者本人的一些偏见，整本书综合来看是非常值得称道的。尤其是关于this这一JavaScript中让很多人头疼的黑魔法，本书讲得颇为透彻。我是建议每一个前端从业者都阅读一下这本书的，后面的中卷和下卷不谈（说实话中卷就比较一般了，而下卷比较烂），至少上卷是一定要读一读的，本身两百页不到的书也花不了几天就能读完。
