你不知道的JavaScript(上卷)pdf

图书网 2018年12月28日17:04:5822.7K
摘要

JavaScript语言有很多复杂的概念,但却用简单的方式体现出来(比如回调函数),因此,JavaScript开发者无需理解语言内部的原理,就能编写出功能全面的程序;就像收音机一样,你无需理解里面的管子和线圈都是做什么用的,只要会操作收音机上的按键,就可以收听你喜欢的节目。然而,JavaScript的这些复杂精妙的概念才是语言的精髓,即使是经验丰富的JavaScript开发者,如果没有认真学习也无法真正理解语言本身的特性。正是因为绝大多数人不求甚解,一遇到出乎意料的行为就认为是语言本身有缺陷,进而把相关的特性加入黑名单,久而久之就排除了这门语言的多样性,人为地使它变得不完整、不安全。
“你不知道的JavaScript”系列就是要让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途。本书介绍了该系列的两个主题:“作用域和闭包”以及“this和对象原型”。掌握了这些知识之后,无论什么技术、框架和流行词语,你都能轻松理解。

你不知道的JavaScript(上卷) 内容简介

很多人对JavaScript这门语言的印象都是简单易学,很容易上手。虽然JavaScript语言本身有很多复杂的概念,但语言的使用者不必深入理解这些概念就可以编写出功能全面的应用。殊不知,这些复杂精妙的概念才是语言的精髓,即使是经验丰富的JavaScript开发人员,如果没有认真学习的话也法真正理解它们。在《图灵程序设计丛书:你不知道的JavaScript(上卷)》中,我们要直面当前JavaScript开发者“不求甚解”的大趋势,深入理解语言内部的机制。

《图灵程序设计丛书:你不知道的JavaScript(上卷)》既适合JavaScript语言初学者阅读,又适合经验丰富的JavaScript开发人员深入学习。

你不知道的JavaScript(上卷) 目录

版权信息

前言

第一部分 作用域和闭包

第1章 作用域是什么

1.1 编译原理

1.2 理解作用域

1.3 作用域嵌套

1.4 异常

1.5 小结

第2章 词法作用域

2.1 词法阶段

2.2 欺骗词法

2.3 小结

第3章 函数作用域和块作用域

3.1 函数中的作用域

3.2 隐藏内部实现

3.3 函数作用域

3.4 块作用域

3.5 小结

第4章 提升

4.1 先有鸡还是先有蛋

4.2 编译器再度来袭

4.3 函数优先

4.4 小结

第5章 作用域闭包

5.1 启示

5.2 实质问题

5.3 现在我懂了

5.4 循环和闭包

5.5 模块

5.6 小结

附录A 动态作用域

附录B 块作用域的替代方案

B.1 Traceur

B.2 隐式和显式作用域

B.3 性能

附录C this词法

附录D 致谢

第二部分 this和对象原型

第1章 关于this

1.1 为什么要用this

1.2 误解

1.3 this到底是什么

1.4 小结

第2章 this全面解析

2.1 调用位置

2.2 绑定规则

2.3 优先级

2.4 绑定例外

2.5 this词法

2.6 小结

第3章 对象

3.1 语法

3.2 类型

3.3 内容

3.4 遍历

3.5 小结

第4章 混合对象“类”

4.1 类理论

4.2 类的机制

4.3 类的继承

4.4 混入

4.5 小结

第5章 原型

5.1 [[Prototype]]

5.2 “类”

5.3 (原型)继承

5.4 对象关联

5.5 小结

第6章 行为委托

6.1 面向委托的设计

6.2 类与对象

6.3 更简洁的设计

6.4 更好的语法

6.5 内省

6.6 小结

附录A ES6中的Class

A.1 class

A.2 class陷阱

A.3 静态大于动态吗

A.4 小结

你不知道的JavaScript(上卷) 精彩文摘

几乎所有编程语言最基本的功能之一,就是能够储存变量当中的值,并且能在之后对这个值进行访问或修改。事实上,正是这种储存和访问变量的值的能力将状态带给了程序。

若没有了状态这个概念,程序虽然也能够执行一些简单的任务,但它会受到高度限制,做不到非常有趣。

但是将变量引入程序会引起几个很有意思的问题,也正是我们将要讨论的:这些变量住在哪里?换句话说,它们储存在哪里?最重要的是,程序需要时如何找到它们?

这些问题说明需要一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量。这套规则被称为作用域。

但是,究竟在哪里而且怎样设置这些作用域的规则呢?

尽管通常将JavaScript归类为“动态”或“解释执行”语言,但事实上它是一门编译语言。这个事实对你来说可能显而易见,也可能你闻所未闻,取决于你接触过多少编程语言,具有多少经验。但与传统的编译语言不同,它不是提前编译的,编译结果也不能在分布式系统中进行移植。

尽管如此,JavaScript引擎进行编译的步骤和传统的编译语言非常相似,在某些环节可能比预想的要复杂。

在传统编译语言的流程中,程序中的一段源代码在执行之前会经历三个步骤,统称为“编译”。

分词/词法分析(Tokenizing/Lexing)

这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代码块被称为词法单元(token)。例如,考虑程序var a = 2;。这段程序通常会被分解成为下面这些词法单元:var、a、=、2 、;。空格是否会被当作词法单元,取决于空格在这门语言中是否具有意义。

解析/语法分析(Parsing)

这个过程是将词法单元流(数组)转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树。这个树被称为“抽象语法树”(Abstract Syntax Tree,AST)。

var a = 2;的抽象语法树中可能会有一个叫作VariableDeclaration的顶级节点,接下来是一个叫作Identifier(它的值是a)的子节点,以及一个叫作AssignmentExpression的子节点。AssignmentExpression节点有一个叫作NumericLiteral(它的值是2)的子节点。

代码生成

将AST转换为可执行代码的过程称被称为代码生成。这个过程与语言、目标平台等息息相关。

抛开具体细节,简单来说就是有某种方法可以将var a = 2;的AST转化为一组机器指令,用来创建一个叫作a的变量(包括分配内存等),并将一个值储存在a中。

关于引擎如何管理系统资源超出了我们的讨论范围,因此只需要简单地了解引擎可以根据需要创建并储存变量即可。

比起那些编译过程只有三个步骤的语言的编译器,JavaScript引擎要复杂得多。例如,在语法分析和代码生成阶段有特定的步骤来对运行性能进行优化,包括对冗余元素进行优化等。

因此在这里只进行宏观、简单的介绍,接下来你就会发现我们介绍的这些看起来有点高深的内容与所要讨论的事情有什么关联。

图书网:你不知道的JavaScript(上卷)pdf

继续阅读

→→→→→→→→→→→→→→→→→→→→查找获取

程序设计

重构 改善既有代码的设计(中文版)pdf

《重构:改善既有代码的设计》(中文版)所提的这些重构准则将帮助你一次一小步地修改你的代码,这就减少了过程中的风险。很快你就会把这些重构准则和其名称加入自己的开发词典中,并且朗朗上口...
程序设计

数据结构 C语言版 第2版pdf

适读人群 :普通高校电子信息大类本科生学习、考研,同时也适合零售和培训。 采用“案例驱动”的编写模式。书中结合实际应用,将各章按照“案例引入——数据结构及其操作——案例分析与实现”...
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:2   其中:访客  2   博主  0
    • woshiyikeshu
      woshiyikeshu 9

      太棒了,很好的书

      • 兄台你好
        兄台你好 4

        这本也是很不错的书想要,谢谢