登录  /  注册
首页 > web前端 > js教程 > 正文

JavaScript函数式编程中纯函数的理解(代码)

不言
发布: 2019-03-15 14:35:35
转载
2247人浏览过

本篇文章给大家带来的内容是关于javascript函数式编程中纯函数的理解(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

函数式编程中纯函数如何理解?

概念: 不依赖执行的上下文,也不影响上下文的变量,输出只由输入决定

代码理解一下

// 综上,非纯函数,输入依赖外部变量
let b = 1
function unPure(a) {
    return a + b
}

// 综上,非纯函数,输出改变外部变量
let o = {}
function unPure(object) {
    object.ex = 1
    return object
}

// 综上, 纯函数, 输出输入不影响外部变量
function pure(a) {
    let b = 1
    return a + b
}
登录后复制

纯函数的好处

相信大家发现了,无论是概念还是代码理解都很简单, 那为什么要使用纯函数呢? 下面我们罗列一下使用纯函数的好处

  • 可缓存性
  • 可移植性
  • 可测试性
可缓存性

纯函数可以根据输入来做缓存

// 下面的代码我们可以发现相同的输入,再第二次调用的时候都是直接取的缓存
let squareNumber  = memoize((x) => { return x*x; });
squareNumber(4);
//=> 16
squareNumber(4); // 从缓存中读取输入值为 4 的结果
//=> 16
squareNumber(5);
//=> 25
squareNumber(5); // 从缓存中读取输入值为 5 的结果
//=> 25
登录后复制

怎么实现呢? 我们接着看下面的代码

const memoize = (f) => {
  const cache = {};
  return () => {
    var arg_str = JSON.stringify(arguments);
    // 关键就在这里,我们利用纯函数相同输入相同输出的逻辑,在这里利用cache做一个简单的缓存,当这个参数之前使用过时,我们立即返回结果就行
    cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
    return cache[arg_str];
  };
};
登录后复制
可移植性

可移植性大白话过来就是,在任何一个地方都可以随意使用,A项目中使用过的,B项目想要使用直接拿过来就ok的那种

代码再来理解一下

// 我们注意看下方有两个注册的函数

// 不纯的, 如果B项目想要用到这个函数,很显然我们将其依赖的其它服务给搬过去
const signUp = function(attrs) {
  var user = saveUser(attrs);
  welcomeUser(user);
}
// 纯的, 我们再来看看下面这个纯函数写法,纯函数给了我们足够多的信息,我们想在B项目使用其功能只需将单个方法搬过去再给其注入需要的参数即可
const signUp = function(Db, Email, attrs) {
  return function() {
    var user = saveUser(Db, attrs);
    welcomeUser(Email, user);
  };
};
登录后复制
可测试性

综上所述,这个就很简单了,我们不需要关心其它外部的信息,只需要给函数特定的输入,再断言其输出就好了

总结

  • 输出不依赖外部变量
  • 输出不改变外部变量
  • 固定输入固定输出
  • 可缓存,可移植,可测试

以上就是JavaScript函数式编程中纯函数的理解(代码)的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
相关标签:
来源:segmentfault网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号