前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript: 函数式编程 - 声明式函数

JavaScript: 函数式编程 - 声明式函数

作者头像
西南_张家辉
发布2021-02-02 10:13:02
1.3K0
发布2021-02-02 10:13:02
举报
文章被收录于专栏:张家辉的树屋

了解JavaScript函数式编程目录

声明式

声明式代码

什么是声明式,我们将不再指示计算机如何工作,而是指我们明确希望得到的结果。这种编程方式会改变我们习以为常的命令式编程相比,会让我们的轻松许多。

和命令式不同,声明式意味着我们要写表达式,而不是一步一步的指示。

理解声明式代码
代码语言: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 优化代码
再看一个栗子
代码语言:javascript
复制
// 命令式
var authenticate = function(form) {
  var user = toUser(form);
  return logIn(user);
};

// 声明式
var authenticate = compose(logIn, toUser);
复制代码

看过前面文章的朋友应该明白 compose 组合代码的意义。

虽然命令式的版本并不一定就是错的,但还是硬编码了那种一步接一步的执行方式。而 compose 表达式只是简单地指出了这样一个事实:用户验证是 toUser 和 logIn 两个行为的组合。这再次说明,声明式为潜在的代码更新提供了支持,使得我们的应用代码成为了一种高级规范(high level specification)。

声明式最重要的是不是指定执行顺序,所以它天然的适合进行并行运算。它和纯函数一起解释了为何函数式编程是未来并行计算的一个不错的选择 -- 我们真的不需要做什么就能现实一个并行/并发系统。

副作用

如果函数或表达式修改程序的某些状态(除了返回值之外)在其自身范围之外或具有与其调用函数或外部的可观察变量,则称其具有副作用。

  • 上面这句话有点难以理解,我们来看一个栗子
代码语言:javascript
复制
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的实际职责是添加 dateplace,但它正在修改 isActive 的值以及其他一些函数 publishMeetup 所依赖的值,以及 publishMeetup 函数将作为副作用没有所需的输出,因为它的输入在两者之间发生了变化。在程序)中,调试副作用会变得非常困难。

  • 所以我们需要纯函数和声明式函数来隔离这种无用的错误。

为什么使用声明式方式的函数式函数?

  • 在纯函数中,我们总是能保证我们的输出。
  • 低复杂度,我们只需要考虑的是他是做什么的,而不是在乎过程怎么完成的。
  • 易于测试,我们不用依赖于函数的状态,我们只关心结果的验证。
  • 函数式编程更加易于理解。

总结

声明式和命令式的区别和含义,这里我们可以结合上一篇文章 组合代码 相关知识。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 声明式
    • 声明式代码
      • 理解声明式代码
      • 再看一个栗子
  • 副作用
  • 为什么使用声明式方式的函数式函数?
  • 总结
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档