JS 函数柯里化的简单探究

2020-11-01  本文已影响0人  弱冠而不立

什么是柯里化?

柯里化(Currying)是一种对于函数的高阶转换,它指的是将一个函数从可调用的 fn(a, b, c) 转换成可调用的 fn(a)(b)(c)

如何进行柯里化

举个例子,我们有个普通的 ajax 函数来发起请求

function ajax(method, url, data=null) {
  let xhr = new XMLHttpRequest();
  xhr.open(method, url, true);
  xhr.send(data);
}
  1. 在进行柯里化之前,我们先创建一个最简单版本的 curry 函数来将普通函数转换成柯里化的函数
      function curry(fn) {
       return function(method) {
        return function(url) {
          return function(data) {
            return fn(method, url, data);
          }
        }
      }
    }
    
  2. 使用这个最简单版本的 curry 函数来进行柯里化,并使用这个柯里化后的函数
     let ajaxCurried = curry(ajax);
     ajaxCurried("get")("http://a.itying.com/api/productlist")()
    
和用fn(a, b, c) 格式调用的函数是一样能得到结果的

柯里化有什么用?

貌似fn(a, b, c) 调用和 fn(a)(b)(c) 调用没什么区别,但是当函数需要一定程度但不完全复用时,柯里化后的函数的优势就显而易见了。例如以上面的代码为例,我们现在请求的接口需要替换成另一批,但是方法还是get,传统的函数调用写的就是:

let get_xx1 = ajax('get','api/xx1');
let get_xx2 = ajax('get','api/xx2');

而采用柯里化后的函数就可以这样:

let getAjax = ajaxCurried("get");
getAjax("api/xx1");
getAjax("api/xx2");

柯里化后的函数就能根据调用的特定参数进行我们想要的复用。例如:

//get请求 可更换 baseURL
let curriedAjaxGet = ajaxCurried("get")
curriedAjaxGet(baseURL1)()
curriedAjaxGet(baseURL2)()

// 基于 BaseURL 的 post 请求, 可添加 data 参数
/let curriedAjaxGetBaseURL = ajaxCurried("post")("xxxx")
curriedAjaxGetBaseURL(data1)
curriedAjaxGetBaseURL(data2)
上一篇 下一篇

猜你喜欢

热点阅读