Open qiuhongbingo opened 4 years ago
/** * 简单来说,柯里化就是在一个函数中预先填充几个参数 * 这个函数返回另一个函数,这个返回的新函数将其参数和预先填充的参数进行合并,再执行函数逻辑 */ // 举例 const filterLowerThan10 = array => { let result = [] for (let i = 0, length = array.length; i < length; i++) { let currentValue = array[i] if (currentValue < 10) result.push(currentValue) } return result } // filterLowerThan10 还是硬编码写死了 10 这个阈值,我们用 curry 化的思想将其改造 const filterLowerNumber = number => { return array => { let result = [] for (let i = 0, length = array.length; i < length; i++) { let currentValue = array[i] if (currentValue < number) result.push(currentValue) } return result } } const filterLowerThan10 = filterLowerNumber(10) filterLowerThan10([1, 3, 5, 29, 34]) /** * 实现 add 方法,要求 * add(1)(2) == 3 // true * add(1)(2, 3)(4) == 10 // true */ const add = (...arg1) => { let args = [...arg1] const fn = (...arg2) => { args = [...args, ...arg2] return fn } fn.toString = function() { return args.reduce((prev, item) => prev + item, 0) } return fn } /** * 分析这道题:add 函数每次执行后一定需要保证返回一个函数,以供后续继续调用,且返回的这个函数还有返回自身,以支持连续调用 * 同时,为了满足例题条件,需要改写内部返回的函数 toString * 为了进行“求和”操作,需要在 add 函数内部维护一个闭包变量 args,args 是个数组,记录了每次调用是传进来的参数 * toString 方法体中对参数进行求和,fn 方法体中对数组 args 进行添加当前参数的操作 */