函数柯里化
2021-04-25 本文已影响0人
行走的蛋白质
一. 什么是函数柯里化
- 函数柯里化是指将使用多个参数的函数转化成一系列使用一个参数的函数的技术, 它返回一个新的函数, 这个新函数去处理剩余的参数
// ex:
function add(a, b) {
return a + b;
}
add(1, 2) // 3
// 柯里化
const addCurry = curry(add);
addCurry(1)(2) // 3
二. 函数柯里化的实现
- 实现思路: 通过函数的 length 属性获取函数的形参个数, 形参的个数就是所需参数的个数
function curry(fn) {
return _curry.call(this, fn, fn.length);
}
function _curry(fn, len, ...args) {
return function(...params) {
const _args = args.concat(params);
if (_args.length >= len) {
return fn.apply(this, _args);
} else {
return _curry.call(this, fn, len, ..._args);
}
}
}
// test
function add (a, b, c, d) {
return a + b + c + d;
}
const addCurry = curry(add);
console.log(addCurry(1)(2)(3)(4)) // 10
console.log(addCurry(1, 2, 3)(4)) // 10
三. 函数柯里化的作用
- 参数复用: 本质上来说就是降低通用性, 提高适用性
- 假如一个函数需要两个参数, 其中一个参数可能多次调用并不会发生更改, 比如商品打折的力度, 此时可以根据折扣进行封装
- 提前返回
- 经典实例: 元素绑定事件监听器, 区分 IE 浏览器的 attachEvent 方法
- 延迟计算: 柯里化函数不会立即执行计算,第一次只是返回一个函数,后面的调用才会进行计算
四. 经典面试题
// 实现一个add方法,使计算结果能够满足如下预期:
console.log(add(1)(2)(3)) // 6;
console.log(add(1, 2, 3)(4)) // 10;
console.log(add(1)(2)(3)(4)(5)) // 15;
function add() {
let args = [...arguments];
function _add() {
args = args.concat([...arguments]);
return _add;
}
_add.toString = function() {
return args.reduce((pre, cur) => {
return pre + cur;
})
}
return _add;
}