首页 > 语言 > JavaScript > 正文

详解用场景去理解函数柯里化(入门篇)

2024-05-06 15:40:48
字体:
来源:转载
供稿:网友

前言

函数柯里化就是将多参简化为单参数的一种技术方式,其最终支持的是方法的连续调用,每次返回新的函数,在最终符合条件或者使用完所有的传参时终止函数调用。

场景实例

与其他文章不同,我在本文会重点分享一些柯里化的经典使用场景,让你在学会这点技巧后能切实的提升代码的可维护性。

编写可重用小模块代码

比如我们有个方法部分逻辑前置是相同的,后面的执行是因为参数不同导致结果不同的,下面是代码部分。
计算商品的折扣,我们需要根据不同的折扣以及商品的入参返回其实际的价格。

// beforefunction getPrice(price,discount){	return price * discount;}let price = getPrice(500,0.1);// after function getPrice(discount){	return price =>{ 	return price * discount }}// 使用,在这种使用效果下,我们可以固定的肢解拿到百分之十折扣的函数,//也就是针对使用0.1折扣的商品价格都可以简化这个折扣的传递,从而达到简化参数的目的//那么从函数的运行上来讲,也比之前的效率高了,如果解析折扣的过程比较复杂let tenDiscount = getPrice(0.1);let price = tenDiscount(500);let price = getPrice(0.1)(500)

看上去有点鸡肋,因为我们本来的写法很简单,使用了柯里化反而让简单的事情变得复杂了,这主要是因为没有达到我们要把一个函数变成柯里化的经典场景。假如你下面的代码变成了下面这样,也许你就能觉察出如果有使用柯里化就会非常方便了,因为针对第一个参数做了若干的处理,甚至可以称为一个算法或者完整的逻辑判断流程,那么如果有多个参数调用都涉及这个方法的调用,同一个参数的这部分逻辑是相同可以共用跳过的。codepen连接:链接

// complexed fun function getPriceComplex(price,discount){ let actualDiscount = 1; if(discount > 0.8 ) { 	actualDiscount = 0.8; } else if(discount > 0.5){ 	actualDiscount = 0.5; } else { actualDiscount = 0.1; } let actualPrice = price - price % 100 ;	return actualPrice * actualDiscount;}// complexed fun betterfunction getPriceComplexBetter(discount){ let actualDiscount = 1; if(discount > 0.8 ) { 	actualDiscount = 0.8; } else if(discount > 0.5){ 	actualDiscount = 0.5; } else { actualDiscount = 0.1; } return price => { 	 let actualPrice = price - price % 100 ;			return actualPrice * actualDiscount; }}console.log(getPriceComplex(500,0.9))let exp1 = getPriceComplexCp(0.9);console.log(exp1);/** price => { let actualPrice = price - price % 100; return actualPrice * actualDiscount;}*/// 相同的输入参数时 可以缓存下之前代码逻辑的执行结果 实现模块的可重用,如果你之前的逻辑是一个纯函数console.log(exp1(500))// 400console.log(exp1(400))// 320// get real discount // 当你针对第一个参数的逻辑较为复杂时,出于可维护角度,建议如此 ;// 当你另外一个逻辑也是基于这个返回结果时,出于重用角度,建议如此function getActualDiscount(discount){ let actualDiscount = 1; if(discount > 0.8 ) { 	actualDiscount = 0.8; } else if(discount > 0.5){ 	actualDiscount = 0.5; } else { actualDiscount = 0.1; } return actualDiscount;}// complexed fun bestfunction getPriceComplexBest(discount){ let actualDiscount =getActualDiscount(discount); return price => { 	 let actualPrice = price - price % 100 ;			return actualPrice * actualDiscount; }}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选