了解JavaScript函数式编程目录
- 0-了解 JavaScript 函数式编程 - 什么是纯函数
- 1-了解 JavaScript 函数式编程 - 柯里化
- 2-了解 JavaScript 函数式编程 - 代码组合的优势
- 3-了解 JavaScript 函数式编程 - 声明式函数
- 4-了解 JavaScript 函数式编程 - 类型签名
声明式
声明式代码
什么是声明式,我们将不再指示计算机如何工作,而是指我们明确希望得到的结果。这种编程方式会改变我们习以为常的命令式编程相比,会让我们的轻松许多。
和命令式不同,声明式意味着我们要写表达式,而不是一步一步的指示。
理解声明式代码
// 命令式
var makes = [];
for (i = 0; i < cars.length; i++) {
makes.push(cars[i].make);
}
// 声明式
var makes = cars.map(function(car){ return car.make; });
命令式的循环要求你必须先实例化一个数组,而且执行完这个实例化语句之后,解释器才继续执行后面的代码。然后再直接迭代 cars
列表,手动增加计数器,把各种零零散散的东西都展示出来...实在是直白得有些露骨。
使用 map
的版本是一个表达式,它对执行顺序没有要求。而且,map
函数如何进行迭代,返回的数组如何收集,都有很大的自由度。它指明的是做什么,不是怎么做。因此,它是正儿八经的声明式代码。
- 有一个普遍的说法,“虽然如此,但是使用命令式循环的速度要快很多”,这里推荐一个视频大家可以看看 JIT 优化代码 (需要梯子)
再看一个栗子
// 命令式
var authenticate = function(form) {
var user = toUser(form);
return logIn(user);
};
// 声明式
var authenticate = compose(logIn, toUser);
看过前面文章的朋友应该明白 compose 组合代码的意义。
虽然命令式的版本并不一定就是错的,但还是硬编码了那种一步接一步的执行方式。而 compose 表达式只是简单地指出了这样一个事实:用户验证是 toUser 和 logIn 两个行为的组合。这再次说明,声明式为潜在的代码更新提供了支持,使得我们的应用代码成为了一种高级规范(high level specification)。
声明式最重要的是不是指定执行顺序,所以它天然的适合进行并行运算。它和纯函数一起解释了为何函数式编程是未来并行计算的一个不错的选择 -- 我们真的不需要做什么就能现实一个并行/并发系统。
副作用
如果函数或表达式修改程序的某些状态(除了返回值之外)在其自身范围之外或具有与其调用函数或外部的可观察变量,则称其具有副作用。
- 上面这句话有点难以理解,我们来看一个栗子
let meetup = {name:'JS',isActive:true,members:49};
const scheduleMeetup = (date, place) => {
meetup.date = date;
meetup.place = place;
if (meetup.members < 50)
meetup.isActive = false;
}
const publishMeetup = () => {
if (meetup.isActive) {
meetup.publish = true;
}
}
scheduleMeetup('today','Bnagalore');
publishMeetup();
console.log(meetup);
上面的这个程序有副作用,因为函数scheduleMeetup
的实际职责是添加 date
和 place
,但它正在修改 isActive
的值以及其他一些函数 publishMeetup
所依赖的值,以及 publishMeetup
函数将作为副作用没有所需的输出,因为它的输入在两者之间发生了变化。在程序)中,调试副作用会变得非常困难。
- 所以我们需要纯函数和声明式函数来隔离这种无用的错误。
为什么使用声明式方式的函数式函数?
- 在纯函数中,我们总是能保证我们的输出。
- 低复杂度,我们只需要考虑的是他是做什么的,而不是在乎过程怎么完成的。
- 易于测试,我们不用依赖于函数的状态,我们只关心结果的验证。
- 函数式编程更加易于理解。
总结
声明式和命令式的区别和含义,这里我们可以结合上一篇文章 组合代码 相关知识。
- 下篇文章 4-了解 JavaScript 函数式编程 - 类型签名
代办报建
本公司承接江浙沪报建代办施工许可证。
联系人:张经理,18321657689(微信同号)。
17条评论
楼主你想太多了!http://xipinghuashanyiyuan.com/html/30a098988.html
不错的帖子,值得收藏!http://il6kd4.http://www.vhiypvxs99w.com
顶一个!http://1y7dy.snt09.com
经典!http://e5x.zhhgao.com
这个帖子好无聊啊!http://ty1b6.egoujiu.net
收藏了,改天让朋友看看!http://www.jiagu1.com/fei/uoziuhtdt/
这一年啥事没干,光研究楼主的帖子了!http://9mdgd.ja2c.com
楼主的帖子越来越有深度了!http://ll93.niaoca.com
今天上网不回帖,回帖就回精华帖!http://4k8.zhy168.net
好好学习楼主的帖子!http://ux8c7b.hubcezkw.com
今天过得很不爽!http://www.guangcexing.net/voddetail/fndRrwu.html
楼主是在找骂么?http://www.guangcexing.net/voddetail/mDRKcVMP.html
精华帖的节奏啊!http://e9j8.51umo.com.cn
我裤子脱了,纸都准备好了,你就给我看这个?https://www.telegramcnx.com
宇宙第一贴诞生了!http://www.wzb360.com/
楼上的心情不错啊!https://www.btoko.com/
支持楼上的!https://www.btoko.com/
发表评论