观点
是把接收多个参数的函数变换成接收一个单一参数(最初函数的第一个参数)的函数,而且返回接收余下的参数而且返回效果的新函数的手艺。 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