哈哈大笑 发表于 2019-12-9 11:06:15

电子书:《JavaScript函数式编程思想》_潘俊_2019-01-01

582
                       



内容简介:

63不变性
4.2.3读取对象属性
631哲学上的不变性与身份……15
4.3高阶函数
8663.2简单类型与复合类型……153
4.3.1组合谓词函数
6,33值类型与引用类型
43,2改变函数参数数目
634可变类型与不可变类型……155
43.3检查参数类型
63.5可变数据类型的不足之处…156
4.3.4记忆化
63.6克隆与冻结
4.4小结
63.7不可变的数据结构
第5章部分应用和复合
6,38不可变的映射与数组
167
5.1部分应用
639不可变类型的其他好处……170
52柯里化
4小结
5.2.1增强的柯里化
…106第7章递归
52.2从右向Zuo柯里化
7.1调用自身
52.3进一步增强的柯里化
7.1.1递归的思路…………………176
52.4柯里化的性能成本
71.2带累积参数的递归函数……177
应用柯里化的方式
7.2递归的数据结构
数的顺序
构建列表
52.7柯里化与高阶函数
722树
53复合…
3递归与迭代
53.1管道与数据流
7.3.1名称
53.2函数类型与柯里化
7.3.2理念与对比
7.33迭代协议
54.1操作符的函数化
7.3.4递归协议
92
54.2方法的函数化
73.5搜索树
543控制流语句的函数化
74尾部递归…
55性能与可读性
74.1调用堆栈
42尾部调用优化
第6章副作用和不变性
743怎样算是尾部调用
744尾部递归…
62纯函数
7.5递归的效率
6.21外部变量
622实
第8章列表
62.3函数内部的副作用
8.1处理列表
6.24闭包
8.1.1函数的三种写法
非卖品,仅供非商业用途或交流学习使用

违者自负法律责
812处理列表的高阶函数……213
924建构函数
8.2函数式编程的列表接口
9.2.5建构函数与类型继承
8.2.1没有副作用的方法
9,2.6原型与类型继承
82.2有副作用的方法
9.2.7 Proxy与对象继
8.23列表接口中的其他函数……222
9.2.8 Mixin
929工厂画数
第9章从面向对象到函数式编程……2269.3函数式编程的视角
9.1面向对象编程的特点
93.1不可变的对象
9.1.1封装性…
93.2评判面向对象编程
9.12继承性
2279.4方法链与复合函数
9.4.1方法链
9.2 JavaScript面向对象编程
942延迟的方法链…
921创建和修改单个对象
922克隆和复制属性
944函数式的SQL
923原型

第1章■■
名称
般对函数式编程的介绍都会从一等值和纯函数等概念开始,本书却准备在那之前先
篇幅讨论两个通常未得到足够重视的主题:名称和类型系统。前者包括名称绑定
作用域和闭包等内容:后者包括类型的含义和划分、强类型和弱类型、静态类型和动态类
型,以及多态性的内容。理解这些概念对编程很有意义,无论是使用哪种语言,采用什么
范式。具体到本书的核心,使用 JavaScript进行函数式编程,在理解以上普适概念的基础
上,掌握它们在 JavaScript中的特定表现和行为,又具有格外的重要性。这一方面是因为
JavaScript长期以来被认为是一种简单的脚本语言,缺少在通用知识背景下对其特性和行为
的分析,以致对其行为的认识往往是零碎但实用的。另一方面是因为名称和类型系统与
JavaScript的函数式编程有着紧密的关联。嵌套函数和闭包是 Javascript的函数式编程离
开的技术,鸭子类型是 JavaScript借以实现函数式编程通常具备的参数多态性特征的机制
这些内容都将在下面两章中得到充分的讨论
1.1名称绑定」
编程语言中有许多实体:常
量、函数、对象、类型、模块。从计算机的角度来
看,所有这些都是用它们在存储器中的地址来代表的。要人们记住这些地址,并用它们来
思考,当然是不可能的。就像在生活中和处理其他领域的问题一样,人们给编程语言中的
实体以名称。所谓名称绑定( Name binding),是指将名称和它所要代表的实体联系在一起
编程语言中的名称通常又称为标识符( Identifier),它是字符序列,在许多语言中,能使用
的字符种类会受到限制,例如 JavaScript中的标识符只能由字母、数字、$和组成,并且
能以数字开头。广义来说,编程语言中所有可用的名称都经过了绑定,包括在语言设计
阶段绑定的关键字(如if、 while)和操作符(如+、.),我们这里关心的仅仅是程序员
在代码中使用的标识符和它们所代表的实体之间的绑定
名称绑定有3个要素:名称、实体和绑定。创建名称绑定因而也就包含3个动作:创
建名称、创建实体和绑定。创建名称通过声明( Declaration)完成:声明变量、声明函数
丰卖品,仅供非商业用途或交流学习使用

2第1章名称
声明类型等。实体的创建方式随其类型而变化,数字、字符等原始数据类型的值只需写出
其字面值( Litera),更复杂的数据类型值根据所用语言
建。绑定则通过给名称赋
值完成。在有些场景中,创建实体和绑定会在创建名称后自动完成。例如在许多静态类型
的语言里,声明的数字变量若不赋值,会初始化为0。在另一些场景中,创建名称、创建
实体和绑定这3个动作是一并完成的。Java中声明类型和 JavaScript中声明函数都属于这

种情况
名称和实体是相互独立的存在,它们之间的绑定也不是一一对应的。名称可以不绑定
任何实体,如 JavaScript中已声明但未赋值的变量;也可以同时绑定多个实体,如操作符
和方法重载( JavaScript是弱类型的,所以没有方法重载的概念,目前也不支持自定义操作
符重载,不过也用到了重载,+操作符就是如此)。反过来,实体可以不绑定任何名称,如
表达式中未被賦值的对象;也可以同时绑定多个名称(这种现象称为别名 Aliases),如通
过赋值多个变量都指向同一对象
在程序运行过程中,名称和实体都有自己的生存期( Lifetime),从创建开始,到销毁
结束,两者并不一定重合。实体可以延续比某个名称更长的时间。例如调用函数时传入某
个对象参数,在该函数内参数名和对象之间构成绑定,到函数返回时名称失效,但在调用
该函数的代码里对象仍然生存。在特殊情况下,名称的生存期也可能比其中的实体更长
例如在C+中可以手工销毁对象,在以引用方式传递对象参数时,若在被调用者内销毁该
对象,调用者内关于该对象的名称还依然存在,此时的名称就成为悬空指针( Dangling
常量和变量
通常名称所绑定的实体是可以被更换的,这样的名称被称为变量,其绑定的实体称为
变量值,通过赋值来更换变量值。程序中经常会用到一些固定的值,如引力常数、颜色代
码、给用户提示的字符串,将它们绑定到专门的名称有诸多好处:有意义的名称可以充当
所绑定值的注释;多次使用某个值时,用名称不容易输入错误,即使发生错误,编程语言
的编译或运行环境也能发现和报告;一旦需要更换,用名称时只需修改
出代码中所有使用该值的地方并修改。对于绑定这些值的名称,在程序运行过程中更换它
们的值是不需要也不应该的。所以许多编程语言引入了称为常量的名称,它们的值只能在
声明时绑定,之后不允许更换
需要注意的是,常量的值虽然不能被更换,但并不能保证它不会发生
值是简单数据类型的,如布尔值、数字,那么确实不可能改变:假如常量值是复合类型的
如 JavaScript中的对象,那么虽然不能通过賦值更换为其他对象,但是可以修改它的属性

1.2作用域43
值。只有字符串等不可变的复合数据类型,才能够确保常量值不发生改变。关于简单和复
合数据类型,将在第2章中介绍。关于数据的不变性,将在第6章中讨论。在 ECMAScript
2015之前, JavaScript只能通过var语句声明变量。 ECMAScript:2015新增了 const语句以
变量依据其与所绑定的值的关系,可以分为值模型( value model)和引用模型
( Reference model)。采用值模型的变量,可以看作值的容器,赋给变量的值就保存在容器
中。变量值被更改,就在变量读写的位置就地完成。采用引用模型的变量,则是指向它所
绑定的值的指针或者引用。变量值被更改,既有可能是变量被赋予新的指针,也有可能是
指针不变,而它指向的数据发生变化。
变量采取的模型对其被赋值时的行为有很大影响。一个变量的值被赋予另一个变量
采取值类型时,值会被复制,副本保存在被赋值的变量中,两者彻底无关,不会相互影响
采用引用类型时,只是指针被复制,赋予第二个名称,数据仍只有一份,若是一方修改了
指针指向的数据,另一方也能看到同样的变化。前者更.安.全.,后者对于体量巨大的数据则
节省了复制的时间和空间
有些编程语言(如Java、C#)针对不同的数据类型采取不同的模型:布尔值、数字等
简单类型,占用的空间很小,采用值模型;动态数组和映射等复合类型,占用的空间可能
很大,采用引用模型。在这些语言中,又可以把采用值模型的数据类型称为值类型(Vlue
type),把采用引用模型的数据类型称为引用类型( Reference type)。有些编程语言则采取
统一的变量模型,C语言中所有的变量都是值模型的,不过可以通过指针来实现引用类型
的行为。而动态类型的语言因为变量可以被赋予任何类型的值,大多采用单一的引用模型
如Lisp、 Smallta
注意数据的值类型、引用类型和传递参数时的按值和按引用方式是不相干的概念,将
在3.33节中阐释
1.2作用域」
个程序,可以从静态和动态两个角度来观察。前者是用空间的维度,分析程序的代
码:后者是以时间的维度,研究程序的运行。上一节提到名称的生存期,就是采用时间的
维度考察名称有效的问题。程序运行的每一时刻都对应着代码中的某一语句,因而名称在
①英文中常用 Lexical一词,在编程语言的语境中通常译为“词法的”,指的是从字符、单词的角度来考察代码
的文本,用在中文中仍显生硬。本书中采用“文本的”或“空间的”说法,与“时间的”一词分别对应“静
态的”和“动态的


#############################################


泡沫之夏 发表于 2019-12-21 20:02:02



免费下载地址:

http://pan.qqq0.com/file/488067-425769352

页: [1]
查看完整版本: 电子书:《JavaScript函数式编程思想》_潘俊_2019-01-01