这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战
JS函数柯里化
在计算机科学中,柯里化(英语:
Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的,尽管它是Moses Schönfinkel和戈特洛布·弗雷格发明的。 看着这个词,就很高大上的感觉,解释看着好像似懂非懂的样子,不过看看例子就明白了。
常见面试题:实现add(1)(2)(3)(4)=10;
在日常我们经常见到求和的其实是这样的:add(1,2,3) = 6;
function add(x, y, z) {
return x + y + z;
}
console.log(add(1, 2, 3)); // 6
还有另一种写法:
var add = function(x) {
return function(y) {
return function(z) {
return x + y + z;
}
}
}
var addOne = add(1);
var addOneAndTwo = addOne(2);
var addOneAndTwoAndThree = addOneAndTwo(3);
console.log(addOneAndTwoAndThree);
这里我们定义了一个add函数,它接受一个参数并返回一个新的函数。调用add之后,返回的函数就通过闭包的方式记住了add的第一个参数。
怎么说呢,看着是实现功能了,就是有点傻傻的,哈哈哈哈~~
当然我们知道ES6可以再改改上面的代码:
const add = x => y => z => x + y + z;
那么我们用柯里化这个概念来实现一个自动的柯里化函数:
首先我们在第一次执行时候,先定义一个数组专门用来存储所有的参数const _args = [...arguments];;
然后在内部声明一个函数,利用闭包的特性保存在_args中并收集所有的参数值。
再接着利用toString隐式转换的特性,当最后执行隐式转换的时候,计算最终的值并返回。
function add() {
const _args = [...arguments];
function fn() {
_args.push(...arguments);
return fn;
}
fn.toString = function() {
return _args.reduce((sum, cur) => sum + cur);
}
return fn;
}
在面试中,因为没有实际的项目应用,一般会出一个类似于这样的题目,来考一下我们对函数柯里化的认识;
当然我们平时也会应用的到,传统的函数调用需要预先确定所有实参,如果在代码一个地方只获取到一部分实参,在另一个地方获取到另一部分实参,这时候柯里化就能用上了。