函数式编程 / 柯里化
最后更新于:2022-04-02 03:24:16
[TOC]
## 函数式编程
### 异步执行
```
const curry=function (f) {
return function () {
const key=arguments
setTimeout(function () {
console.log(f.apply(f, key));
},0)
}
}
const echo = curry(x=>x)
echo("hello")
console.log("world");
//world
// hello
```
### 缓存函数执行结果
```
const memoize =function (f) {
const cache=[];
return function () {
const key = JSON.stringify(arguments)
if (!cache[key]){
cache[key]=f.apply(this,arguments)
}
return cache[key]
}
}
const add = memoize(x=>x+x)
console.log(add(1));//2
console.log(add(1));//2
```
## 科里化
```
function curry(func) {
return function curried(...args) {
// function.length 用来获取函数的形参个数
// arguments.length 获取的是实参个数
if (args.length >= func.length) {
return func.apply(this, args)
}
return function (...args2) {
return curried.apply(this, args.concat(args2))
}
}
}
// 示意而已
function ajax(type, url, data) {
var xhr = new XMLHttpRequest();
xhr.open(type, url, true);
xhr.send(data);
}
// 虽然 ajax 这个函数非常通用,但在重复调用的时候参数冗余
ajax('POST', 'www.test.com', "name=kevin")
ajax('POST', 'www.test2.com', "name=kevin")
ajax('POST', 'www.test3.com', "name=kevin")
// 利用 curry
var ajaxCurry = curry(ajax);
// 以 POST 类型请求数据
var post = ajaxCurry('POST');
post('www.test.com', "name=kevin");
// 以 POST 类型请求来自于 www.test.com 的数据
var postFromTest = post('www.test.com');
postFromTest("name=kevin");
```
';