概念
是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。 from wiki百科
Function.prototype.curry = function() {
let args = arguments;
let that = this;
return function() {
return that.apply(null, [...args].concat(...arguments));
}
}
function add() {
let args = [...arguments];
let sum = 0, i = 0;
while(i < args.length) {
sum += args[i];
i++;
}
return sum;
}
console.log(add.curry(2, 3)(4)) // 9
以上就是 一个简单的函数柯里化的实现。
运用
为什么要封装一层呢?就要说到柯里化的运用了。js中最最经典的柯里化运用就是bind了, 用于函数的this值绑定, 同时并非让函数立即执行。
// bind实现
Function.prototype.bind = function (context) {
var that = this
var args = Array.prototype.slice.call(arguments, 1)
return function() {
return that.apply(context, args)
}
}
还有一些网上的例子,日常开发中也常常会用到,如参数复用。
引用https://www.jianshu.com/p/297...
// 函数封装后
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 hasLetter = curryingCheck(/[a-z]+/g)
hasNumber('test1') // true
hasNumber('testtest') // false
hasLetter('21212') // false
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。