这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」
这篇其实是笔者研究函数式编程的的后续,如果对于闭包有不了解的地方还是请移步到链接的地方查看上一篇juejin.cn/post/699617…
1.tap函数:
笔者也是看书学到的找个东西,简单来说就是tap函数是一个接收一个参数,返回一个函数,返回函数的参数会接受一些参数,这里例子中为想要被执行的函数
const tap = (value)=>{
return (func)=>{
return typeof(fn) === "function" && fn(value),console.log('我是value',value);
}
}
(exp1,exp2)的含义是它将执行两个参数,并返回第二个表达式的结果,即exp2;也就是说,上面的例子会执行fn函数,也会打印value
🚀 tap函数测试:
//tap函数
tap("杰克凯鲁亚克")((value)=>{
console.log("痛仰乐队的再见杰克唱的是",value);
});
🚀 调试来自于服务器的数据:
forEach([1,2,3,4,5],(val)=>{
tap(val)(()=>{
//调试代码
console.log(val);
})
})
- 就是
参数和执行分离,从而达到调试的效果
2.Unary(一元)函数:
unary函数主要是用来把函数转换成只接收一个参数的函数
//unary函数
var res = [1,2,3,4,5,6].map(parseInt);
console.log('我是map的结果',res);
const unary = (fn)=>{
return fn.lenth===1 ? fn:(arg)=>fn(arg)
};
var res1 = [1,2,3,4,5,6].map(unary(parseInt));
console.log('我是使用unary函数处理后的结果',res1);
🚀 结果如下:
🚀 拓展面试题:数组的map函数传入parseInt后
- 需要知道的
除'1','0'外,其他均不能用来表达二进制数
3.Once函数:
顾名思义,就是让给定的函数只运行一次:
//once函数的简单实现:
const once = (fn) => {
let done = false;
return function () {
return done ? undefined : ((done = true), fn.apply(this, arguments));
};
};
var doPayment = once(() => {
console.log('抽烟只抽煊赫门,一生只爱一个人');
});
doPayment();
doPayment();
🚀 结果如下图:
调动了两次doPayment函数,但是只打印了一次结果
- 需要注意的点就是
done ? undefined : ((done = true), fn.apply(this, arguments));,三元操作符后面出现了逗号,笔者之前是没见过哈,才疏学浅记录下。
4.memoized函数:
之前提到过的函数式编程中的引用透明性(对于给定输入,得出唯一输出),利用这个特性可以来缓存从而提升程序性能。
以递归为例:
//计算阶乘函数factorial
var factorial = (n) => {
if (n === 0) {
return 1;
}
//这个是递归
return n * factorial(n - 1);
};
上面函数为计算阶乘函数fatorial,每次计算都需要运行一次得到结果,那如果4的阶乘之前算过了,是否能拿到之前已经有的结果绕过计算,从而提升性能呢?
🚀 memoized函数:
const memoized = (fn)=>{
const resObj= {};
return (arg) => resObj(arg) || (resObj[arg] = fn(arg));
}
🚀 使用memoized缓存阶乘结果:
var testMemorized = memoized(factorial);
var testRes = testMemorized(5);
testMemorized(5);
console.log('我是阶乘的结果',testRes);