已知 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
function curryIt(fn) { var len = fn.length; var args = []; var result = arg => { args.push(arg); len--; return len == 0 ? fn.apply(this, args) : result; } return result; }
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; }