Day10-闭包应用-偏应用函数与柯里化

简介: Day10-闭包应用-偏应用函数与柯里化

基本概念


好先介绍概念。


偏应用函数 Partial application


In computer science, partial application (or partial function application) refers to the process of fixing a number of arguments to a function, producing another function of smaller arity.


我们可以把他翻译成局部应用


将一个三参数的add函数变为一个add3


参考 github.com/hemanth/fun…


// Helper to create partially applied functions
// Takes a function and some arguments
const partial = (f, ...args) =>
  // returns a function that takes the rest of the arguments
  (...moreArgs) =>
    // and calls the original function with all of them
    f(...args, ...moreArgs)
// Something to apply
const add3 = (a, b, c) => a + b + c
// Partially applying `2` and `3` to `add3` gives you a one-argument function
const fivePlus = partial(add3, 2, 3) // (c) => 2 + 3 + c
fivePlus(4) // 9


柯里化 -Curried functions


柯里化是将一个多参数函数转换成多个单参数函数,也就是将一个 n 元函数转换成 n 个一元函数


const sum = (a, b) => a + b
const curriedSum = (a) => (b) => a + b
const curry = fn => x => y => fn(x , y)
curriedSum(40)(2) // 42.
const add2 = curriedSum(2) // (b) => 2 + b
add2(10) // 12


实例1: 分割函数转CSV


const split = (regex, str) => ("" + str).split(regex);
const elements = split("v1,v2,v3", /,\s*/);
const partial =
  (f, ...args) =>
  (...moreArgs) =>
    f(...args, ...moreArgs);
const csv = partial(split, /,\s*/);
const s = csv("v1,v2,v3");
console.log(s);


实例2: Vue3 CompositionAPI


想起了来自台湾的Antfu的代码


Antfu


github.com/vueuse/vueu…


import { createApp, h, watchEffect, reactive } from "vue";
// 抽象的LocalStorage解决方案
const useLocalStorage = (key, defaultValue) => {
  const data = reactive({});
  Object.assign(
    data,
    (localStorage[key] && JSON.parse(localStorage[key])) || defaultValue
  );
  watchEffect(() => (localStorage[key] = JSON.stringify(data)));
  return data;
};


上面是一个抽象Localstore钩子


// 用于指定持久化方案
const useStorage = (defaultValue) => {
  return useLocalStorage("store", defaultValue);
};
const store = useStorage({count: 0})


下面我们用偏应用函数恶搞一下他


// 偏应用函数
const partial =
(f, ...args) =>
(...moreArgs) =>
f(...args, ...moreArgs);
// 指定使用LocalStorage存储
const useStorage = partial(useLocalStorage, "store");
// 声明响应式数据
const store = partial(useStorage, { count: 0 });


完整的例子


github.com/su37josephx…


实例3: React Hooks


reacthook原理没有区别,欢迎大家补充


面试攻略



点评


  • 闭包处处都有,但是能说出经典应用又是一个难题。说Helloworld和背题没啥区别。



相关文章
|
8天前
|
存储 JavaScript 前端开发
如何在函数式编程中使用解构赋值来传递函数?
在函数式编程中,解构赋值为函数的传递和组合提供了一种简洁、灵活且富有表现力的方式,能够帮助开发者更清晰地表达代码的意图,提高代码的可读性和可维护性,同时也更好地体现了函数式编程的思想和原则。
20 2
|
6月前
什么是闭包?手写一个闭包函数
什么是闭包?手写一个闭包函数
47 0
|
6月前
|
存储 缓存 自然语言处理
高阶函数离不开闭包
高阶函数离不开闭包
|
JavaScript 前端开发 Java
函数式编程入门:理解纯函数、高阶函数与柯里化
函数式编程入门:理解纯函数、高阶函数与柯里化
166 0
|
存储 关系型数据库 Python
函数式编程:一等对象、作用域和高阶函数的综合指南
函数式编程:一等对象、作用域和高阶函数的综合指南
52 0
柯里化函数简单实现
柯里化是一种函数式编程技术,可以将一个接受多个参数的函数转换成一系列接受一个参数的函数,这些函数可以在被顺序调用的过程中逐步累积参数,最终返回结果。
|
存储 JavaScript 前端开发
柯里化
柯里化
73 0
|
PHP 开发者
匿名函数闭包|学习笔记
快速学习匿名函数闭包
匿名函数闭包|学习笔记
|
自然语言处理 JavaScript 前端开发
一文讲懂什么是函数柯里化,柯里化的目的及其代码实现
一文讲懂什么是函数柯里化,柯里化的目的及其代码实现
300 0
一文讲懂什么是函数柯里化,柯里化的目的及其代码实现