练习牛客网笔试题--前端js--39-柯里化
// 题目描述
// 已知 fn 为一个预定义函数,实现函数 curryIt,调用之后满足如下条件:
// 1、返回一个函数 a,a 的 length 属性值为 1(即显式声明 a 接收一个参数)
// 2、调用 a 之后,返回一个函数 b, b 的 length 属性值为 1
// 3、调用 b 之后,返回一个函数 c, c 的 length 属性值为 1
// 4、调用 c 之后,返回的结果与调用 fn 的返回值一致
// 5、fn 的参数依次为函数 a, b, c 的调用参数
// 输入
// var fn = function (a, b, c) {
// return a + b + c
// }; curryIt(fn)(1)(2)(3);
// 输出 6
1.自己的练习
// 有局限性:只适合本题的输入
function curryIt(fn) {
return function a(x) {
return function b(y) {
return function c(z) {
return fn(x,y,z)
}
}
}
}
//简化
function curryIt(fn) {
return a = (x) => {
return b = (y) => {
return c = (z) => fn(x,y,z)
}
}
}
//简化
function curryIt(fn) {
return (x) => (y) => (z) => fn(x,y,z)
}
2.题解
// 函数柯里化的实现,只不过严格限制了每次返回的函数只能传入一个参数:
function curryIt(fn) {
let args = []
return function curried(arg) {
args.push(arg)
if (args.length >= fn.length) {
return fn.apply(this, args)
} else {
return function(arg2) {
return curried.call(this, arg2)
}
}
}
}