

浅聊偏函数
source link: https://www.fly63.com/article/detial/11642
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

扫一扫分享
什么是偏函数?
首先我们知道,这是一个函数:
function ajax(url, data, callback) {
// ..
}
这是另外一个函数:
function ajaxTest1(data, callback) {
ajax('http://www.test.com/test1', data, callback);
}
ajaxTest1 函数相比 ajax 函数,少传了一个参数,它的 url 被固定到了 ajaxTest1 的函数体内;
同理,我们还可以写出 ajaxTest2、ajaxTest3、……、ajaxTestN
如果我们直接写:
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 函数,使得封装后的函数 能够先绑定部分参数, 这个封装后的函数就是偏函数;
let ajaxTest2 = partial(ajax,'http://www.test.com/test2')
我们用 partial 函数封装了 ajax 函数,然后先绑定了 url 为 'www.test.com/test2' ,封装后的 ajaxTest2 就是偏函数,是函数 ajax 的偏函数;
调用方式不变:
ajaxTest2(data,callback)
这样做的好处就是,我们复用了 ajax,并且封装后的偏函数,需要的传参更少了,这一点十分关键;老观众都知道:在函数式编程中我们提倡:函数的输入和输出,都尽量保持只有 1 个是最佳的。
那么,现在的问题就来了,partial 这个用于封装的函数怎么实现的呢??
和前面提到过的柯里化很像,partial 的目的就是收集参数,然后传给回调函数,它是这样的:
function partial(fn, ...presetArgs) { // presetArgs 是需要先被绑定下来的参数
return function partiallyApplied(...laterArgs) { // ...laterArgs 是后续参数
let allArgs =presetArgs.concat(laterArgs) // 收集到一起
return fn.apply(this, allArgs) // 传给回调函数 fn
}
}
这就是基础的偏函数理解。
实际上,针对不同的削减参数的需求,偏函数有不同的写法;但是原理是不变的:对原始函数二次封装,固定部分参数,返回回调函数,只需要传入更少的参数~~
作者:掘金安东尼
链接:https://juejin.cn/post/7104409137110335502
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK