前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >浅聊偏函数

浅聊偏函数

作者头像
掘金安东尼
发布2022-09-19 10:46:33
1700
发布2022-09-19 10:46:33
举报
文章被收录于专栏:掘金安东尼

theme: juejin

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情


什么是偏函数?

首先我们知道,这是一个函数:

代码语言:javascript
复制
function ajax(url, data, callback) {
  // ..
}

这是另外一个函数:

代码语言:javascript
复制
function ajaxTest1(data, callback) {
  ajax('http://www.test.com/test1', data, callback);
}

ajaxTest1 函数相比 ajax 函数,少传了一个参数,它的 url 被固定到了 ajaxTest1 的函数体内;

同理,我们还可以写出 ajaxTest2、ajaxTest3、……、ajaxTestN

如果我们直接写:

代码语言:javascript
复制
function ajaxTest2(data, callback) {
  ajax('http://www.test.com/test2', data, callback);
}

function ajaxTest3(data, callback) {
  ajax('http://www.test.com/test3', data, callback);
}

......

function ajaxTestN(data, callback) {
  ajax('http://www.test.com/testN', data, callback);
}

这样有问题吗?

从“能用就行”的角度看,是可以的;如果是从“设计模式”的角度看,就不太 ok 了!

因为这样写,都没有复用到 ajax 函数呀 😂

基于这种背景,偏函数应用应用而生!

它做了什么?—— 用一个函数封装 ajax 函数,使得封装后的函数 能够先绑定部分参数, 这个封装后的函数就是偏函数;

比方说:

代码语言:javascript
复制
let ajaxTest2 = partial(ajax,'http://www.test.com/test2')

我们用 partial 函数封装了 ajax 函数,然后先绑定了 url 为 'http://www.test.com/test2' ,封装后的 ajaxTest2 就是偏函数,是函数 ajax 的偏函数;

调用方式不变:

代码语言:javascript
复制
ajaxTest2(data,callback)

这样做的好处就是,我们复用了 ajax,并且封装后的偏函数,需要的传参更少了,这一点十分关键;老观众都知道:在函数式编程中我们提倡:函数的输入和输出,都尽量保持只有 1 个是最佳的。

那么,现在的问题就来了,partial 这个用于封装的函数怎么实现的呢??

和前面提到过的柯里化很像,partial 的目的就是收集参数,然后传给回调函数,它是这样的:

代码语言:javascript
复制
function partial(fn, ...presetArgs) { // presetArgs 是需要先被绑定下来的参数
  return function partiallyApplied(...laterArgs) { //  ...laterArgs 是后续参数
        let allArgs =presetArgs.concat(laterArgs) // 收集到一起
        return fn.apply(this, allArgs) // 传给回调函数 fn
  }
}

这就是基础的偏函数理解。

实际上,针对不同的削减参数的需求,偏函数有不同的写法;但是原理是不变的:

对原始函数二次封装,固定部分参数,返回回调函数,只需要传入更少的参数~~

OK,以上便是本篇分享。点赞关注评论,为好文助力👍 我是掘金安东尼 🤠 100 万阅读量人气前端技术博主 💥 INFP 写作人格坚持 1000 日更文 ✍ 陪你一起度过漫长岁月 🌏

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • theme: juejin
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档