WHAT - 前端柯里化

一、介绍

柯里化(Currying)是一种将接受多个参数的函数转换成一系列接受一个参数的函数的技术。

在 JavaScript 中,可以使用柯里化来创建一个函数,使其可以接受部分参数,并返回一个新的函数来接受剩余的参数。

下面是一个简单的示例,演示如何使用柯里化来创建一个加法函数:

// 加法函数
const add = (x, y) => x + y;

// 柯里化函数
// const curriedAdd = x => y => x + y
const curriedAdd = x => {
	return function(y) {
		return x + y;
	}
};

// 使用
console.log(add(2, 3)); // 输出 5
console.log(curriedAdd(2)(3)); // 输出 5

在这个示例中,curriedAdd 是一个柯里化函数。当我们调用 curriedAdd(2) 时,它返回一个新函数,这个新函数接受参数 y,并将 x(在这里是 2)与 y 相加。所以 curriedAdd(2)(3) 实际上是将 23 相加。

柯里化可以使函数更加灵活,可以更方便地部分应用参数或者延迟执行。

二、Currying Transformation

示例一:

console.log(curry(sum)(1)(2)); // 3

// curry(f) does the currying transform
function curry(f) {
  return function(a) {
    return function(b) {
      return f(a, b);
    };
  };
}
// usage
function sum(a, b) {
  return a + b;
}

示例二:

console.log(currying(sum)(1)(2, 3)(4)); // 10

function currying(fn) {
  return function(a) {
    return function(b, c) {
      return function(d) {
        return fn(a, b, c, d);
      }
    }
  }
}
function sum(a, b, c, d) {
    return a + b + c + d;
}

示例三:

console.log(add(1)(2)(3)(4)(5).sum()); // 15
console.log(add(1)(2, 3)(4)(5).sum()); // 15

function add(...args) {
    let total = args.reduce((acc, val) => acc + val, 0);
    function innerAdd(...nextArgs) {
        if (nextArgs.length === 0) {
            return total;
        }
        total += nextArgs.reduce((acc, val) => acc + val, 0);
        return innerAdd;
    }
    innerAdd.sum = function() {
        return total;
    };
    return innerAdd;
}

三、优势

柯里化就是只传递给函数部分参数,而让其返回一个函数去处理剩余的参数,而费这么大力气如此封装,好处也是很明显的:

1. 参数复用

将变化的参数封装成一个单独的柯里化函数,其他地方复用:

// const check = (reg, text) => return reg.test(text);

const curringCheck = (reg) => {
  return function(text) {
    return reg.test(text);
  }
}
let hasNumber = curringCheck(/\d+/g);
let hasletter = curringCheck(/[a-z]+/g);

当有许多地方需要校验是否有数字或是否有字母,就需要复用 reg 参数,利用柯里化将其封装,会让代码可读性更强。

2. 避免判断逻辑重复执行

const on = (ele, event, handler) => {
  if(document.addEventListener) {
    console.log("support addEventListener");
    if(ele && event && handler) {
      ele.addEventListener(event, handler, false);
    }
  } else {
    console.log("not support addEventListener");
    if(ele && event && handler) {
      ele.attactEvent('on'+event, handler);
    }
  }
}

// 利用柯里化实现自执行并返回一个新函数,并提前确定执行哪个逻辑,避免每次都要进行判断
const on = (function() {
  if(document.addEventListener) {
    return function(ele, event, handler) {
        if(ele && event && handler) {
            ele.addEventListener(event, handler, false);
        }
    }
  } else {
    return function(ele, event, handler) {
        if(ele && event && handler) {
            ele.attactEvent('on' + event, handler);
        }
    }
  }
})();
// 上述代码只需要执行一次
on(element, event, handler);

注意,上述代码最大价值就是逻辑复用,即判断逻辑只需要执行一次即可。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JS柯里化是一种函数式编程的技术,由阮一峰在其博客中首次介绍。所谓柯里化,就是将一个接受多个参数的函数转变为接受单一参数的函数序列的过程。 柯里化的主要思想是延迟计算。通过柯里化,可以将一个具有多个参数的函数转化为一个接收单一参数的函数,这样的函数可以等到所有参数都准备好之后再进行计算。这样做的好处是可以将函数的使用更加灵活,调用的时候可以逐个传入参数,也可以一次性传入多个参数。另外,这样还可以用来创建一些固定部分参数的新函数,提高代码的复用性。 在JS中柯里化可以通过函数递归的方式实现。函数递归地返回一个新函数,新函数可以保存已接收到的参数,并在接收新参数后进行计算和返回。因为JS的函数可以作为一等公民,可以作为参数和返回值,所以可以非常方便地实现柯里化柯里化在实际应用中非常有用。比如在函数式编程中,柯里化可以用来创建高阶函数,可以根据传入的参数动态生成一个新的函数。另外,柯里化还可以用来解决数据优先编程的问题,即将传入的数据先与函数返回的新函数结合,然后再进行计算。 总之,JS柯里化是一种将多参数函数转化为接收单一参数的函数序列的技术,可以通过函数递归实现。柯里化的应用非常广泛,可以用于创建高阶函数和解决数据优先编程的问题。阮一峰在其博客中详细解释了柯里化的概念和实现方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值