js 常见方法实现----函数柯里化实现

函数柯里化

通用实现

function curry(fn, ...args) {
  if (args.length >= fn.length) return fn(...args);
  return function (...args2) {
    return curry(fn, ...args, ...args2);
  }
}

对于如何理解curring的实现 暂时参照JS中的柯里化 及 精巧的自动柯里化实现
有空会更深入的理解一下

概念(wiki): curring 是把接受多个参数的函数变成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

示例

function add(x,y) {
	return x + y
}
//curring 处理
function curringAdd (x) {
	return function (y) {
		return x + y
	}
}

add(1, 2) //  3
curringAdd(1)
curringAdd(1)(2)

就是处理一部分参数 返回一个函数 用于处理剩下的参数

为什么要用curring呢?
  • 参数复用
  • 提前确认
  • 延迟运行
参数复用
function check(reg, txt){
	return reg.test(txt)
}
check(/\d+/g, 122)
check(/[a-z]+/g, 'aaa')
check(/\d+/g, 'text')
// 如果我们要不同的地方都要验证同一个正则规则,那么第一参数就可以进行复用了 
function curringCheck (reg) {
	return function(text) {
		return reg.test(text)
	}
}
let isNum = curringCheck(/\d+/g)
let isString = curringCheck(/[a-z]+/g)
isNum(123)
isNum(text)
isString('ret')

这样就实现了参数复用(我们经常用到哪些 参数复用 的情况 什么情况下考虑使用curring 达到参数复用呢?)

提前确认
const addEvent = function (elem, type, fn, cature) {
    if (window.addEventListener) {
        elem.addEventListener(type, (e) => fn.call(elem, e), capture);
    } else if (window.attachEvent) {
        elem.attachEvent('on' + type, (e) => fn.call(elem, e);
    }
}
// 柯里化
const addEvent = (function () {
    if (window.addEventListener) {
        return (elem, type, fn, capture) => {
            elem.addEventListener(type, (e) => fn.call(elem, e), capture);
        };
    } else {
        return (elem, type, fn, capture) => {
            elem.attachEvent('on' + type, (e) => fn.call(elem, e);
        };
    }
})();

上面代码和下面的柯里化以后的区别是 我们在使用addEvent函数的时候第二种写法 已经知道我们要用的是 addEventListener还是attachEvent,而第一种写法要判断用哪个,所以柯里化就提前确认

延迟运行
Function.prototype.bind = function (context) {
    var _this = this
    var args = Array.prototype.slice.call(arguments, 1)
 
    return function() {
        return _this.apply(context, args)
    }
}

参考详解JS函数柯里化

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值