CodeWhy JS 函数式编程 笔记
创始人
2025-05-28 02:03:44
0

JS 函数式编程

纯函数

函数式编程中有一个非常重要的概念叫纯函数,JavaScript符合函数式编程的规范,所以也有纯函数的概念

  • react开发中纯函数是被多次提及
  • 比如react中组件就被要求像是一个纯函数redux中有一个reducer的概念,也是要求必须是一个纯函数
  • 所以掌握纯函数对于理解很多框架的设计是非常有帮助的

在程序设计中,若一个函数符合以下条件,那么这个函数被称为纯函数: (维基百科)

  • 此函数在相同的输入时,需产生相同的输出
  • 函数的输出和输入值之外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关
  • 该函数不能由语义上可观察的函数副作用,诸如“触发事件”,“是输出设备输出,或更改输出值意外物件的内容等

副作用——在执行一个函数时,除了返回函数值以外,还对调用函数产生附加的影响,比如修改全局变量,修改参数或改变外部存储

【举例】:

function foo (num1,num2) {return num1 + num2;
}

优势

  1. 因为你可以安心的编写和使用
  2. 写的时候保证函数的纯度,只是单纯实现自己业务逻辑即可,不需要关心传入的内容是如何获得的或者依赖其他的外部变量是否发生修改
  3. 用的时候输入的内容不会被任意篡改,并且自己确定的输入,一定有确定的输出

柯里化

把接收多个参数的函数,变成接收一个单一参数(最初函数的第一个参数)的函数,并且返回接收余下的参数,而且返回结果的新函数的技术

总结:只传递函数一部分参数来调用它,让它返回一个函数去处理剩余的参数

function bar (m) {return function(n) {return function(x) {return function(y) {m+n+x+y}}}
}bar(1)(2)(3)(4)

简化:

var sum = x => y => z => x + y + z

为什么需要有柯里化

  • 在函数式编程中,我们其实往往希望一个函数处理的问题尽可能的单一,而不是讲一大堆的处理过程交给一个函数来处理
  • 那么我们是否可以将每次传入的参数再单一的函数中进行处理,处理完后再下一个函数中再使用处理后的结果
var log = date => type => message => {console.log(`[${date.getHours()}:${date.getMinutes}][${type}] : [${message}]`)
}var errorLog = log(new Date())()

将普通函数转化为柯里化的函数:

function hyCurrying(fn) {function curried(...args) {// 判断函数所需参数的长度与实际参数接收的参数是否一致// fn.length函数所需的参数长度if (fn.length <= args.length) {// 直接调用函数return fn.apply(this, args);} else {// 没有达到个数时,需要递归接收参数return function (...args2) {return curried.apply(this, args.concat(args2));};}}return curried;
}function add(a, b, c, d) {return a + b + c + d;
}const hyAdd = hyCurrying(add);console.log(hyAdd(1, 2, 3, 4)); // 10
console.log(hyAdd(1, 2)(3, 4)); // 10
console.log(hyAdd(1, 2, 3)(4)); // 10

组合函数

  • 比如我们现在需要对某一个数据进行函数的调用,执行两个函数fn1和fn2,这两个函数是依次执行的
  • 那么如果每次我们都需要进行两个函数的调用,操作上就会显得重复
  • 那么是否可以将炸两个函数组合起来,自动依次调用呢?
  • 那么过程就是对函数得组合,我们称之为组合函数
var double = function(num) {return num * 2
}var square = function(num) {return num ** 2
}// 组合函数,先调用m函数再调用n函数  
function composeFn(m,n) {return function(count) {return n(m(count))}
}var newFn = composeFn(double,square)
console.log(newFn(10))

创建组合函数:

function hyCompose(fns) {var length = fns.length;for (var i = 0; i < length; i++) {if (typeof fns[i] !== "function") {throw new TypeError("Excepted arguments are functions");}}function compose(...args) {var index = 0;var result = length ? fns[index].apply(this, args) : args;while (++index < length) {result = fns[index].call(this, result);}return result;}return compose;
}

相关内容

热门资讯

“国补”继续!10月将下达第四... 8月1日国家发展改革委召开新闻发布会,解读当前经济形势和经济工作。国家发展改革委政策研究室有关负责人...
港股IPO,重大调整! 8月1日,港交所就优化首次公开招股市场定价及公开市场规定的咨询文件刊发咨询总结,并就持续优化公众持股...
两江新区:148家智慧医疗装备... 近日,江小妹获悉, 2025年上半年, 作为重庆高新产业的“主阵地”, 两江新区生命健康产业增长势头...
造纸江湖浮沉:废纸回收价5年内... 本报(chinatimes.net.cn)记者何一华 李未来 北京报道 “最近收废纸的价格涨了,以前...
国邦医药已累计回购538万股公... 8月1日晚间,国邦医药发布公告称,截至7月31日,公司通过集中竞价交易方式累计回购股份537.527...
融资杠杆误区:满仓加杠杆不对,... 融资杠杆作为资本市场中通过借入资金放大投资规模的工具,其核心是借助信用机制扩大交易筹码,在提升资金使...
“反内卷”的风吹到了惠民保 记者 姜鑫 7月31日晚,国家金融监督管理总局办公厅发布了《关于推动城市商业医疗险高质量发展的通知》...
酒类即时零售调查:市场规模突破... 出品|搜狐财经 作者|饶婷 编辑|李文贤 【编者按】当数字浪潮席卷消费市场,酒业的 “触网” 之路早...
股票行情快报:赫美集团(002... 证券之星消息,截至2025年8月1日收盘,赫美集团(002356)报收于3.2元,上涨0.31%,换...
刘庆峰说马斯克不懂AI:科大讯... 文:互联网江湖 刘致呈 敢直言马斯克不懂AI的人,出现了。 最近,科大讯飞董事长刘庆峰在与正和岛总...
国债等利息收入增值税恢复征收,... 界面新闻记者 | 杨志锦 界面新闻编辑 | 王姝 财政部、税务总局8月1日发布公告称,自2025...
历史重演?美国7月非农暴雷,美... 来源:第一财经 作为本周最受关注的数据,美国7月非农就业报告意外不及预期,加之此前两个月数据大幅下修...
8月8日起,新发行国债等债券的... 两部门发文恢复征收国债、地方债、金融债券利息收入增值税 财政部、国家税务总局1日联合对外发布公告称,...
首个旧改做地转化宅地 广州市客... 观点网7月31日,广州越秀区挂牌市客运站商住地块,计划于9月1日10时竞价。 该地块位于环市路以南,...
就业引擎熄火,美联储还能“稳住... 来源:市场资讯 来源:汇通网 汇通财经APP讯——7月美国非农就业数据大幅低于预期,仅新增7.3万个...
【公告精选】601088,筹划... 中国神华:筹划发行股份及支付现金购买资产并募集配套资金 股票8月4日起停牌 九号公司:上半年净利12...
原创 一... “老铁们,这周行情像不像坐过山车?指数蔫了吧唧,个股却玩起高空蹦极!南新制药一周暴涨78%,市值差点...
星巴克中国业务竞购名单曝光!腾... 《科创板日报》8月1日讯(记者 徐赐豪),星巴克中国业务的未来发展又有了新变数。 据报道,有知情人士...
带娃去四川三天两夜旅游攻略!成... 我一直梦想着带家人来一场说走就走的旅行,而四川,这个充满魅力的地方,就成了我们的首选。四川不仅有壮丽...
江苏银行:截至目前绿色融资余额... 8月1日,上证报记者从江苏银行获悉,截至目前,该行绿色融资余额已突破7000亿元,服务绿色企业超12...