在线客服

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

adminadmin 报建百科 2024-04-25 18 0
JavaScript: 函数式编程 - 声明式函数

了解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的实际职责是添加 dateplace,但它正在修改 isActive 的值以及其他一些函数 publishMeetup 所依赖的值,以及 publishMeetup 函数将作为副作用没有所需的输出,因为它的输入在两者之间发生了变化。在程序)中,调试副作用会变得非常困难。

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

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

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

总结

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

  • 下篇文章 4-了解 JavaScript 函数式编程 - 类型签名
本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!
代办报建

本公司承接江浙沪报建代办施工许可证。
联系人:张经理,18321657689(微信同号)。

喜欢0发布评论

评论列表

发表评论

  • 昵称(必填)
  • 邮箱
  • 网址