Javascript函数式编程-高阶函数02

229 阅读2分钟

这是我参与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后

www.cnblogs.com/touryung/p/…

  • 需要知道的除'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);