1. 概念
”函数柯里化”是指将多变量函数拆解为单变量的多个函数的依次调用, 可以从高元函数动态地生成批量的低元的函数。
简单讲:就是利用函数执行,可以形成一个不销毁的私有作用域,把预先处理的内容都存在这个不销毁的作用域里面,
并且返回一个函数,以后要执行的就是这个函数。
举个栗子:
// 常规的add函数 function add(x, y) { return x + y } // Currying后 function curryingAdd(x) { return function (y) { return x + y } } add(1, 2) // 3 curryingAdd(1)(2) // 3
在柯里化后,将函数的一个参数拆分为两个乃至更多参数
2. 用途
2.1 参数复用
// 正常正则验证字符串 reg.test(txt) // 函数封装后 function check(reg, txt) { return reg.test(txt) } check(/\d+/g, 'test') //false check(/[a-z]+/g, 'test') //true // Currying后 function curryingCheck(reg) { return function(txt) { return reg.test(txt) } } var hasNumber = curryingCheck(/\d+/g) var hasString = curryingCheck(/[a-z]+/g) hasNumber('test1') // true hasNumber('testtest') // false hasString('21212') // false
对于正则的校验,如果有很多地方都要校验是否有数字,我们只需要将第一个参数reg进行复用,
这样别的地方就能够直接调用hasNumber,hasString等函数,让参数能够复用。
2.2 提前返回
//把isSupport这个参数给先确定下来 var on = function(element, event, handler) { if (document.addEventListener) { if (element && event && handler) { element.addEventListener(event, handler, false); } } else { if (element && event && handler) { element.attachEvent('on' + event, handler); } } } var on = (function() { if (document.addEventListener) { return function(element, event, handler) { if (element && event && handler) { element.addEventListener(event, handler, false); } }; } else { return function(element, event, handler) { if (element && event && handler) { element.attachEvent('on' + event, handler); } }; } })(); //后一种方法 var on = function(isSupport, element, event, handler) { isSupport = isSupport || document.addEventListener; if (isSupport) { return element.addEventListener(event, handler, false); } else { return element.attachEvent('on' + event, handler); } }
后一种方法可以避免每次都进行判断,提前确定了哪一种方法,提前返回。
2.3 延迟运行
bind函数实现机制就是柯里化的封装
Function.prototype.bind = function (context) { var _this = this var args = Array.prototype.slice.call(arguments, 1) return function() { return _this.apply(context, args) } }
延迟执行,在没有输入参数时,不计算总结果。等需要计算的时候,再计算。
本文引自:https://blog.csdn.net/aaaaa1994/article/details/94359366