实现函数 partialUsingArguments,调用之后满足如下条件:
1、返回一个函数 result
2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数
1、bind方法
function partialUsingArguments(fn) { return fn.bind(this, ...[...arguments].slice(1)); }
2、call方法
function partialUsingArguments(fn) { var arr = [...arguments].slice(1); return function() { return fn.call(this, ...arr, ...arguments); } }
3、apply方法
function partialUsingArguments(fn) { var arr = [...arguments].slice(1); return function() { return fn.apply(this, arr.concat(...arguments)); } }
4、es6
function partialUsingArguments(fn) { var [_, ...arr] = arguments; return (...args) => fn(...arr, ...args); // return (...args) => fn.call(fn, ...arr, ...args); }
5、bind + apply 方法
function partialUsingArguments(fn) { var arr = [...arguments].slice(1); arr.unshift(fn); // fn、null、this都可以 return fn.bind.apply(fn,arr); // arr[0]为传给bind的第一个参数 }
function partialUsingArguments(fn) { const param = Array.prototype.slice.call(arguments,1) const result = function(){ return fn.apply(this,param.concat(Array.prototype.slice.call(arguments))) } return result }
function partialUsingArguments(fn) { //获得函数partialUsingArguments 除第一个参数外的参数数组 var args = Array.prototype.slice.call(arguments,1); var result = function(){ //获得函数result的参数数组 var args1 = Array.prototype.slice.call(arguments); return fn.apply(this,args.concat(args1)); } return result; }
function partialUsingArguments(fn) { var arr = Array.prototype.slice.call(arguments, 1); return function(){ arr = arr.concat(Array.prototype.slice.call(arguments)); if(arr.length < fn.length){ var temp = arr.slice(); temp.unshift(fn); return partialUsingArguments.apply(null, temp); } else { return fn.apply(null, arr); } } }
function partialUsingArguments(fn){ var arg=[]; for(var i=1;i<arguments.length;i++){ arg.push(arguments[i]) } var result=function(){ var args=[]; for(var i=0;i<arguments.length;i++){ args.push(arguments[i]) } return fn.apply(null,arg.concat(args)); }; return result; }
function partialUsingArguments(fn) { var _args = Array.prototype.slice.apply(arguments) _args.shift() var result = function(...args) { return fn.apply(null, _args.concat(args)) } return result }将...args也换成普通arguments的处理方式就能通过
function partialUsingArguments(fn) { var arr = Array.prototype.slice.call(arguments, 1); return function(){ var arr2 = Array.prototype.slice.call(arguments); return arr.concat(arr2).reduce(function(pre, cur){ return pre + cur; }); }; }