函数的柯里化

79 阅读1分钟

原帖juejin.cn/post/684490…

函数柯里化(Currying), 是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

简单来说,就是固定一些参数,返回一个接受剩余参数的函数。实质就是使用闭包返回一个延迟执行函数。 其好处主要在于:

参数复用,或者说是固定参数,避免重复传参; 提前返回,或者说是提前确认,避免重复判断; 延迟执行。

然后做下记录:

掘金_函数的柯里化.png

function curry(fn, ...args) { // console.info(args) return (...callbackArgs) => { // console.info(callbackArgs) const currentArgs = [...args, ...callbackArgs]; // console.info(currentArgs.length,fn.length) return callbackArgs.length === 0 || currentArgs.length === fn.length ? fn(...currentArgs) : curry(fn, ...currentArgs); } }

let phoneReg = /^1[3-9]\d{9}$/;

// function _checkPhone(reg, phone) { // console.info(phone) // return reg.test(phone); // }

// console.log(_checkPhone(phoneReg, 19956526362));

// 柯里化 // let checkPhone = curry(_checkPhone)(phoneReg); // 这样我们就复用了验证手机的正则,这就是复用参数,或者说是固定参数 // checkPhone(19956526362); // checkPhone(16956526362);

// 既然是对同一个号码做判断,我们当然可以先将判断结果保存下来,这样就不用每次都做判断了 function _doSomething(reg, phone, callback) { reg.test(phone) && callback(); }

let doSomething = curry(_doSomething)(phoneReg)(19956526362); // 这里就是提前返回电话号码是否正确了 function callback1(){ console.info("sth1") } function callback2(){ console.info("sth2") } doSomething(callback1); // 这里就是延迟执行 doSomething(callback2);