function atarr(a,index){ var index=index||0,args = new Array(a.length - index); for(var i in a){ if(i>=index) args[i-index]=a[i]; } return args; } function m(scope,fn){ if(arguments.length<3) return fn.call(scope); var p = atarr(arguments,2); return function(){ var args = atarr(arguments); return fn.apply(scope,p.concat(args)); } }
var plus = function(a,b){ return a+b; }; var plus2 = m(null,plus,2); console.log(plus2(10)); console.log(plus2(0)); //结果 12 2
这样我们的目标已经实现啦。在上面的atarr函数是将arguments对象中指定位置开始的参数取出并且保存到一个数组中。m函数就是主角,它完成了前面定义的任务,实现了保存函数链上的参数并且返接受余下参数的函数。测试代码中的plus函数原先接受a,b两个参数并返回a与b之和,即 int -> int -> int,而plus2则变成了接受一个参数b与2相加,并返回2与b之和,即 int -> int。