通俗易懂,讲讲函数柯里化

与函数绑定密切相关

函数柯里化用于创建已经设置好了一个或者多个参数的函数。函数柯里化的基本方法是:使用一个闭包返回一个函数。当函数被调用时,返回的函数还需要设置一些传入的参数。

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

由于作者水平有限,如有错误和不足,请不吝指出。谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值