Appearance
O’Reilly Media通过图书、 杂志、 在线服务、 调查研究和会议等方式传播创新知识。 自 1978 年开始,O’Reilly一直都是前沿发展的见证者和推动者。 超级极客们正在开创 着未来, 而我们关注真正重要的技术趋势—— 通过放大那些“ 细微的信号”来刺激社 会对新科技的应用。 作为技术社区中活跃的参与者,O’Reilly的发展充满了对创新的 倡导、创造和发扬光大。
O’Reilly为软件开发人员带来革命性的“动物书”;创建第一个商业网站(GNN);组 织了影响深远的开放源代码峰会, 以至于开源软件运动以此命名; 创立了Make杂志, 从而成为DIY革命的主要先锋; 公司一如既往地通过多种形式缔结信息与人的纽带。 O’Reilly的会议和峰会集聚了众多超级极客和高瞻远瞩的商业领袖, 共同描绘出开创 新产业的革命性思想。 作为技术人士获取信息的选择,O’Reilly现在还将先锋专家的 知识传递给普通的计算机用户。 无论是通过书籍出版, 在线服务或者面授课程, 每一 项O’Reilly的产品都反映了公司不可动摇的理念——信息是激发创新的力量。
业界评论
“O’Reilly Radar博客有口皆碑。”
—— Wired
“O’Reilly凭借一系列(真希望当初我也想到了)非凡想法建立了数百万美元的业务。” —— Business 2.
“O’Reilly Conference是聚集关键思想领袖的绝对典范。” —— CRN
“一本O’Reilly的书就代表一个有用、有前途、需要学习的主题。” —— Irish Times
“Tim是位特立独行的商人, 他不光放眼于最长远、 最广阔的视野并且切实地按照
Yogi Berra的建议去做了: ‘如果你在路上遇到岔路口, 走小路( 岔路)。’回顾过去 Tim似乎每一次都选择了小路,而且有几次都是一闪即逝的机会,尽管大路也不错。” —— Linux Journal
O’Reilly Media, Inc. 介绍
IV
目录
前言 ......................................................................................................................................................VIII
- 序 第一部分 作用域和闭包
- 第 1 章 作用域是什么
- 1.1 编译原理
- 1.2 理解作用域
- 1.2.1 演员表
- 1.2.2 对话
- 1.2.3 编译器有话说
- 1.2.4 引擎和作用域的对话
- 1.2.5 小测验
- 1.3 作用域嵌套
- 1.4 异常
- 1.5 小结
- 第 2 章 词法作用域
- 2.1 词法阶段
- 2.2 欺骗词法
- 2.2.1 eval
- 2.2.2 with
- 2.2.3 性能
- 2.3 小结
- 第 3 章 函数作用域和块作用域 目录 | V
- 3.1 函数中的作用域
- 3.2 隐藏内部实现
- 3.3 函数作用域
- 3.3.1 匿名和具名
- 3.3.2 立即执行函数表达式
- 3.4 块作用域
- 3.4.1 with
- 3.4.2 try/catch
- 3.4.3 let
- 3.4.4 const
- 3.5 小结
- 第 4 章 提升
- 4.1 先有鸡还是先有蛋
- 4.2 编译器再度来袭
- 4.3 函数优先
- 4.4 小结
- 第 5 章 作用域闭包
- 5.1 启示
- 5.2 实质问题
- 5.3 现在我懂了
- 5.4 循环和闭包
- 5.5 模块
- 5.5.1 现代的模块机制
- 5.5.2 未来的模块机制
- 5.6 小结
- 附录A 动态作用域
- 附录B 块作用域的替代方案
- 附录C this词法
- 附录D 致谢
- 序 第二部分 this和对象原型
- 第 1 章 关于this
- 1.1 为什么要用this VI | 目录
- 1.2 误解
- 1.2.1 指向自身
- 1.2.2 它的作用域
- 1.3 this到底是什么
- 1.4 小结
- 第 2 章 this全面解析
- 2.1 调用位置
- 2.2 绑定规则
- 2.2.1 默认绑定
- 2.2.2 隐式绑定
- 2.2.3 显式绑定
- 2.2.4 new绑定
- 2.3 优先级
- 2.4 绑定例外
- 2.4.1 被忽略的this
- 2.4.2 间接引用
- 2.4.3 软绑定
- 2.5 this词法
- 2.6 小结
- 第 3 章 对象
- 3.1 语法
- 3.2 类型
- 3.3 内容
- 3.3.1 可计算属性名
- 3.3.2 属性与方法
- 3.3.3 数组
- 3.3.4 复制对象
- 3.3.5 属性描述符
- 3.3.6 不变性
- 3.3.7 [[Get]]
- 3.3.8 [[Put]]
- 3.3.9 Getter和Setter
- 3.3.10 存在性
- 3.4 遍历
- 3.5 小结
- 第 4 章 混合对象“类”
- 4.1 类理论
- 4.1.1 “类”设计模式
- 4.1.2 JavaScript中的“类” 目录 | VII
- 4.2 类的机制
- 4.2.1 建造
- 4.2.2 构造函数
- 4.3 类的继承
- 4.3.1 多态
- 4.3.2 多重继承
- 4.4 混入
- 4.4.1 显式混入
- 4.4.2 隐式混入
- 4.5 小结
- 4.1 类理论
- 第 5 章 原型
- 5.1 [[Prototype]]
- 5.1.1 Object.prototype
- 5.1.2 属性设置和屏蔽
- 5.2 “类”
- 5.2.1 “类”函数
- 5.2.2 “构造函数”
- 5.2.3 技术
- 5.3 (原型)继承
- 5.4 对象关联
- 5.4.1 创建关联
- 5.4.2 关联关系是备用
- 5.5 小结
- 5.1 [[Prototype]]
- 第 6 章 行为委托
- 6.1 面向委托的设计
- 6.1.1 类理论
- 6.1.2 委托理论
- 6.1.3 比较思维模型
- 6.2 类与对象
- 6.2.1 控件“类”
- 6.2.2 委托控件对象
- 6.3 更简洁的设计
- 6.4 更好的语法
- 6.5 内省
- 6.6 小结
- 6.1 面向委托的设计
- 附录A ES6中的Class................................................................................................................
前言
在互联网发展的早期,JavaScript就已经成为了支撑网页内容交互体验的基础技术。 那时 JavaScript的作用可能仅仅是生成一些闪烁的鼠标轨迹或者烦人的弹出窗口, 但是经过了 大约 20 年的发展,JavaScript的技术和能力都发生了天翻地覆的变化, 现在的JavaScript 毫无疑问已经成为了世界上使用范围最广的软件平台——互联网——的核心技术。
但是作为一个语言来说, 它总是成为大家批评的对象, 部分原因是它有很多历史遗留问 题, 但主要原因是它的设计哲学有问题。就像Brendan Eich曾经说过的,JavaScript甚至连 名字都给人一种“ 蠢弟弟”的感觉, 就像是它更成熟的大哥Java的不完整版本。 不过名字 只不过是营销策略上的一个意外, 这两个语言有许多本质上的区别。JavaScript和Java的 关系,就像Carnival(嘉年华)和Car(汽车)的关系一样,八竿子打不着。
JavaScript借鉴了许多语言的概念和语法, 比如C风格的过程式编程以及不太明显的 Scheme/List风格的函数式编程, 因此吸引了许多开发者, 甚至是那些不会编程的新手。 用 JavaScript来编写“Hello World”是非常简单的,因此这门语言很有吸引力并且很好上手。
虽然JavaScript可能是最早出现的语言之一,但是由于其本身的特殊性,相比其他语言,能 真正掌握JavaScript的人比较少。如果想用C、C++这样的语言编写功能全面的程序,那需 要对语言有很深的了解。但是对于JavaScript来说,编写功能全面的程序仅仅是冰山一角。
JavaScript语言本质上有许多复杂的概念, 但是却用一种看起来比较简单的方式体现出来, 比如回调函数, 因此JavaScript开发者通常只是简单地使用这些特性, 并不会关心语言内 部的实现原理。
JavaScript既是一门充满吸引力、 简单易用的语言, 又是一门具有许多复杂微妙技术的语 言,即使是经验丰富的JavaScript开发者,如果没有认真学习的话也无法真正理解它们。
VIII
前言 | IX
这就是JavaScript的矛盾之处,也是这门语言的阿喀琉斯之踵^1 。由于JavaScript不必理解就 可以使用,因此通常来说很难真正理解语言本身,这就是我们面临的挑战。
使命
如果每次遇到JavaScript中出乎意料的行为时, 你的反应就是把它加入黑名单( 很多人都 是这么做的),那用不了多久你就会把JavaScript语言真正的多样性全部排除。
剩下的部分就是非常著名的“ 好的部分”(Good Parts),但是亲爱的读者们, 我恳请你们 把它称作“简单的部分”、“安全的部分”甚至“不完整的部分”。
“你不知道的JavaScript”系列丛书要做的事恰好相反: 学习并且深入理解整个JavaScript, 尤其是那些“难的部分”。
在本书中, 我们要直面当前JavaScript开发者不求甚解的大趋势, 他们往往不会深入理解 语言内部的机制,遇到困难就会退缩。我们要做的恰好相反,不是退缩,而是继续前进。
你们应当像我一样, 不满足于只是让代码正常工作, 而是想要弄清楚“ 为什么”。我希望 你能勇于挑战这条崎岖颠簸的“ 少有人走的路”,拥抱整个JavaScript。掌握了这些知识之 后,无论什么技术、框架和流行词语你都能轻松理解。
这个系列中的每本书专注于语言中一个最容易被误解或者最难理解的核心部分, 进行深 入、 详尽的介绍。 在阅读本书时, 你应当审视自己对于JavaScript的理解, 仔细思考书中 讲解的理论和那些“你需要知道”的东西。
现在你所理解的JavaScript很可能是从别人那里学来的不完整版。这样的JavaScript只是真 正的JavaScript的影子。 学完这个系列之后, 你就会掌握真正的JavaScript。读下去吧, 我 的朋友,JavaScript恭候你的光临。
小结
JavaScript非常特殊, 只学一部分的话非常简单, 但是想要完整地学习会很难( 就算学到 够用也不容易)。当开发者感到迷惑时, 他们通常会责怪语言本身, 而不是怪自己对语言 缺乏了解。这个系列就是为了解决这个问题,让你打心眼儿里欣赏这门语言。
本书中的许多例子都需要运行在即将到来的现代JavaScript引擎环境中, 比 如ES6。部分代码在旧(ES6之前的)引擎上可能无法正常运行。
注 1 :指某人或某事物的最大或者唯一弱点,即罩门关键所在。——译者注
X | 前言
本书排版约定
本书中使用以下排版约定。
- 楷体 表示新的术语。
- 等宽字体 表示代码段以及段落中的程序元素, 比如变量、 函数名、 数据库、 数据类型、 环境变 量、语句以及关键字。
- 等宽粗体 表示命令中不可改动的部分。
- 等宽斜体 表示将由用户提供的值(或由上下文确定的值)替换的文本。
这个图标表示提示或建议。
这个图标表示重要说明。
这个图标表示警告或提醒。
使用代码示例
可以在这里下载本书第一部分“ 作用域和闭包”随附的资料( 代码示例、 练习题等):
可以在这里下载本书第二部分“this和对象原型”随附的资料( 代码示例、 练习题等):
让本书助你一臂之力。 也许你需要在自己的程序或文档中用到本书中的代码。 除非大段大
前言 | XI
段地使用, 否则不必与我们联系取得授权。 例如, 无需请求许可, 就可以用本书中的几段 代码写成一个程序。 但是销售或者发布O’Reilly图书中代码的光盘则必须事先获得授权。 引用书中的代码来回答问题也无需授权。 将大段的示例代码整合到你自己的产品文档中则 必须经过许可。
使用我们的代码时, 希望你能标明它的出处, 但不强求。 出处信息一般包括书名、 作者、 出版商和书号,例如: Scope and Closures ,Kyle Simpson著(O’Reilly, 2014 )。版权所有,
978-1-491-33558-8。
如果还有关于使用代码的未尽事宜,可以随时与我们联系:permissions@oreilly.com。
Safari
®
Books Online
Safari Books Online (http://www.safaribooksonline.com)是应需 而变的数字图书馆。 它同时以图书和视频的形式出版世界顶级 技术和商务作家的专业作品。
Safari Books Online是技术专家、 软件开发人员、Web设计师、 商务人士和创意人士开展 调研、解决问题、学习和认证培训的第一手资料。
对于组织团体、 政府机构和个人,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 ) 奥莱利技术咨询(北京)有限公司
XII | 前言
O’Reilly的每一本书都有专属网页, 你可以在那儿找到本书的相关信息, 包括勘误表、 示 例代码以及其他信息。本书第一部分“作用域和闭包”的网址是http://oreil.ly/JS_scope_ closures。本书第二部分“this和对象原型”的网址是http://bit.ly/ydk-js-this-object-prototypes。
对于本书的评论和技术性问题,请发送电子邮件到:
要了解更多O’Reilly图书、培训课程、会议和新闻的信息,请访问以下网站:
JS
http://www.oreilly.com
我们在Facebook的地址如下:http://facebook.com/oreilly
请关注我们的Twitter动态:http://twitter.com/oreillymedia
我们的YouTube视频地址如下:http://www.youtube.com/oreillymedia
要查看“你不知道的JavaScript”系列丛书中的全部图书,请访问:
JS
http://YouDontKnowJS.com
[美]Kyle Simpson 著 赵望野 译
你不知道的 JavaScript