详解JS函数柯里化
参考:详解JS函数柯里化
维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
Currying有哪些好处
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 hasLetter = curryingCheck(/[a-z]+/g) hasNumber('test1') // true hasNumber('testtest') // false hasLetter('21212') // false
2.延迟运行
Function.prototype.bind = function (context) { var that = this var args = Array.prototype.slice.call(arguments, 1) return function() { return that.apply(context, args) } }
一道经典面试题
// 实现一个add方法,使计算结果能够满足如下预期: add(1)(2)(3) == 6; add(1, 2, 3)(4) == 10; add(1)(2)(3)(4)(5) == 15;
function add2() { let args = Array.prototype.slice.call(arguments); console.log('---0---',arguments) function sum() { console.log('---1---',arguments) args.push(...arguments); return sum; } sum.toString = function () { console.log('---2---',args) let res = 0; let n = args.length; for(let i=0;i<n;i++){ res +=args[i]; } return res; } return sum; } console.log( add2(1)(2)(3) +'' ) // 6 console.log( add2(1, 2, 3)(4) +'' ) // 10 console.log( add2(1)(2)(3)(4)(5)+'' ) // 15 console.log( add2(2, 6)(1) +'' ) // 9