与函数绑定密切相关
函数柯里化用于创建已经设置好了一个或者多个参数的函数。函数柯里化的基本方法是:使用一个闭包返回一个函数。当函数被调用时,返回的函数还需要设置一些传入的参数。
function add(num1, num2) {
return num1 + num2;
}
function curriedAdd(num2) {
return add(1, num2);
}
add(1, 2); // 3
curriedAdd(2) // 3:
上述代码中,curriedAdd 方法实际是第一个参数为 1 的 add 方法,这并非柯里化的函数,只是在展示函数柯里化的概念。
// 函数柯里化通常由一下步骤动态创建,传入要柯里化的函数和必要参数
function curry(fn) {
// 获得要柯里化函数的必要参数
// arguments 是假数组(类似数组,却不能使用数组的方法)
let args = Array.prototype.slice.call(arguments, 1);
return function() {
// 获得柯里化后的函数传入的参数
let innerArgs = Array.prototype.slice.call(arguments, 0);
// 总传入参数
let finalArgs = args.concat(innerArgs);
return fn.apply(null, finalArgs);
}
}
// 获得一个与 10 进行相加的新的函数
const curriedAdd = curry(add, 10);
curriedAdd(0xf); // 25
仔细琢磨一下上面的代码,认真想一想~
可能你懂了一点点,但感觉又差了点意思,不慌,我们再来一个例子。
// 这是我看到的最好理解的一个例子了
// 假如我们现在需要做一个正则验证,验证字符串中是否有 'e'
function check(reg,s) {
return reg.test(s);
}
check(/e/g, 'hello world'); // true
// 如果我们这样做:
function regExpCheck(regExp, s) {
return regExp.test(s);
}
// 看到这里应该有点感觉了哈
const numberCheck = curry(regExpCheck, /\d/g);
const letterCheck = curry(regExpCheck, /[a-zA-Z]/g);
numberCheck('hello world'); // false
numberCheck('2021-4-24'); // true
letterCheck('hello world'); // true
letterCheck('2021-4-24'); // false
由于作者水平有限,如有错误和不足,请不吝指出。谢谢。