# 前言
在第一章我们主要介绍了函数的一些基本功能和结构,以及介绍了一些实用的小技巧。这些都是为了后面一步一步入门打下好的基础。因为函数式编程并不是一个看看文档就能很好掌握的东西,它需要你集合实际例子然后理解每一步为什么要这样,如果你只是想粗略的看看,不去思考🤔,相信我,后面的案例你会感觉特别跳,特别绕(开始学习时我就是这样😼)。
在这一章中,我会针对函数式编程的另一个重点:函数的输入来做讲解和案例分析,个人建议:打开你的vscode,关上文档,把案例敲上一遍,需要的时候把每一步做个对比,确保自己是真的理解它们。
# 偏函数
先来看一个大家都很熟悉的函数:
- 一个
ajax函数,第一个参数为请求的API地址,第二个为请求的参数,第三个是请求成功之后的回调函数。
function ajax (url, data, callback) {
// ...
}
@前端进阶之旅: 代码已经复制到剪贴板
- 现在如果你已经很确定一个
API地址,此外只是需要等待另外两个参数的时候,比如获取用户信息和获取订单详情的请求:
function getUser (data, cb) {
ajax('/api/user', data, cb)
}
function getOrder (data, cb) {
ajax('api/order', data, cb)
}
@前端进阶之旅: 代码已经复制到剪贴板
- 现在如果你已经很确定一个
API地址,同时已经很确定请求的参数(比如用户的id),此外只需要等待另一个参数的时候:
function getCurrentUser (cb) {
getUser({ userId: 1 }, cb)
}
function getCurrentOrder (cb) {
getUser({ orderId: 1 }, cb)
}
@前端进阶之旅: 代码已经复制到剪贴板
不知道大家发现了没,从第一步到第三步,每过一步,函数的参数就少一个,直到最后只需要传递一个cb。
用一句话来说明发生的事情:getUser(data, cb)是ajax(url, data, cb)的偏函数(partially-applied functions)。
(注意⚠️:前方高能!)
关于该模式更正式的说法是:偏函数严格来讲是一个减少函数参数个数(arity)的过程;这里的参数个数指的是希望传入的形参的数量。我们通过 getUser(..) 把原函数 ajax(..) 的参数个数从 3 个减少到了 2 个。
# partial函数
在上面的例子中,getCurrentUser(cb)和getCurrentOrder(cb)的模式其实很想,我们可以来定一个partial()实用函数:
function partial (fn, ...prestArgs) {
return function partiallyApplied (...laterArgs) {
return 