函数柯里化

文章介绍了柯里化的基本概念,通过示例展示了如何在JavaScript中实现柯里化,包括简单实现和通用实现。柯里化可以用于参数复用,例如在正则校验的场景中,并且解释了JavaScript中bind方法的原理与其与柯里化的关联。此外,还提供了一个延迟运行的示例来进一步阐述柯里化的应用。
摘要由CSDN通过智能技术生成

柯里化名词解释

柯里化简单实现

// 普通的add函数
var add = function(a, b){
  return a + b;
}

// 柯里化后
var addCurry = function(a){
  return function (b) {
    return a + b;
  };
}
var addCurryTest = addCurry(1)

console.log(add(1,2));
console.log(addCurryTest(4));

请添加图片描述

  • JavaScript并没有实现curry方法,但我们可以给Function.prototype扩展此功能。柯里化通用实现:
// 普通的add函数
var add = function(a, b){
  return a + b;
}
// 给语言的基本类型扩充功能
// 通过给Function.prototype增加方法使得该方法对所有函数可用。
Function.prototype.method = function (name, func) {
  if(!this.prototype[name]){
    this.prototype[name] = func;
  }
  return this;
}

// 通用curry实现
Function.method('curry', function () {
  var slice = Array.prototype.slice;
  var args = slice.apply(arguments);
  console.log(args);
  var that = this;
  return function () {
    console.log(slice.apply(arguments));
    return that.apply(null, args.concat(slice.apply(arguments)));
  }
})

var addTest = add.curry(1);
console.log(addTest(6));

请添加图片描述

柯里化应用

参数复用

// 给语言的基本类型扩充功能
// 通过给Function.prototype增加方法是的该方法对所有函数可用。
Function.prototype.method = function (name, func) {
  if(!this.prototype[name]){
    this.prototype[name] = func;
  }
  return this;
}

// 通用curry实现
Function.method('curry', function () {
  var slice = Array.prototype.slice;
  var args = slice.apply(arguments);
  // console.log(args);
  var that = this;
  return function () {
    // console.log(slice.apply(arguments));
    return that.apply(null, args.concat(slice.apply(arguments)));
  }
})

// 正则校验的复用
function check(reg, text){
  return reg.test(text);
}

var hasNumber = check.curry(/\d+/g);
var hasLetter = check.curry(/[a-z]+/g);

console.log(hasNumber('test1'));
console.log(hasNumber('asdasd'));
console.log(hasLetter('123123123'));
console.log(hasLetter('Hello'));

请添加图片描述

延迟运行(js中的bind实现机制就是currying)

var sum = function () {
  let sum = 0;
  for(let i = 0; i < arguments.length; i++){
    sum += arguments[i];
  }
  return sum;
}

Function.prototype.bind = function (context) {
  var _this = this
  var args = Array.prototype.slice.call(arguments, 1)

  return function() {
      return _this.apply(context, args)
  }
}

console.log(sum.bind(null, 1, 1, 3, 5)());

var curry = function(fn) {
  var _args = []
  return function cb() {
      if (arguments.length == 0) {
          return fn.apply(this, _args)
      }
      Array.prototype.push.apply(_args, arguments);
      return cb;
  }
}
console.log(curry(sum)(1,2,3)(1,2)())

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值