已知 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
var fn = function (a, b, c) {return a + b + c}; curryIt(fn)(1)(2)(3);6
function curryIt(fn) {
function a(str1) {
function b(str2) {
function c(str3) {
return fn.call(this, str1, str2, str3)
}
c.length = 1;
return c;
}
b.length = 1;
return b;
}
a.length = 1
return a;
} javascript权威指南p191: ES5中的bind()方法不仅仅是将函数绑定至一个对象, 而且还附带一些其它应用: 除了第一个实参之外,传入bind()的实参也会绑定至this, 这个附带的应用是一种常见的函数编程技术, 有时也被称为“柯里化”(currying)。 于是就有了这个答案,每次传一个参数。 the another answer is: (https://github.com/rmurphey/js-assessment-answers/blob/master/app/functions.js)
function curryIt(fn){ return function a(arg){ var g=fn.bind(null,arg); return function b(arg1){ var h=g.bind(null,arg1); return function c(arg2){ return h(arg2); } } } }
function curryIt(fn) {
//获取fn参数的数量
var n = fn.length;
//声明一个数组args
var args = [];
//返回一个匿名函数
return function(arg){
//将curryIt后面括号中的参数放入数组
args.push(arg);
//如果args中的参数个数小于fn函数的参数个数,
//则执行arguments.callee(其作用是引用当前正在执行的函数,这里是返回的当前匿名函数)。
//否则,返回fn的调用结果
if(args.length < n){
return arguments.callee;
}else return fn.apply("",args);
}
}
function curryIt(fn) {
var a=function (A) {
//var argA=arguments[0];
var b=function (B) {
//var argB=arguments[0];
var c=function (C) {
//var argC=arguments[0];
return fn.call(null,A,B,C);
};
c.length=1;
return c;
};
b.length=1;
return b;
};
a.length=1;
return a;
}