实现函数 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) { // ES6 var [a, ...arr1] = arguments; function result(){ var [...arr2] = arguments; return fn(...arr1, ...arr2) } return result; }
function partialUsingArguments(fn){ //得到partialUsingArguments方法第一个参数后面的参数组成的数组 var args=Array.prototype.slice.call(arguments,1); var result=function(){ //将上面的args和result的参数组合成一个数组argss var argss=args.concat(Array.prototype.slice.call(arguments)); //fn调用这个参数数组 return fn.apply(null,argss); } return result; } 这样写好不好?
function partialUsingArguments(fn) { var args=[].slice.call(arguments,1); //fn.apply(null,args); var result=function () { return fn.apply(this,args.concat([].slice.call(arguments))); }; return result; }
function partialUsingArguments(fn){ var args=arguments; function array(a,n){ return Array.prototype.slice.call(a,n||0); } return function(){ var a=array(args,1); a= a.concat(array(arguments)); return fn.apply(this,a); } } var a = 1; var b = 2; var c = 3; var d = 4; var test = function (first, second, third, forth) { return first + second + third + forth; }; document.write(partialUsingArguments(test, a, b)(c, d)); /* 题目是二次封装函数,在javascript权威指南第六版p197中说的不完全函数就是这个 是一种函数变换技巧,即把一次完整的函数调用拆成多次函数调用,每次传入的实参都是完整的一部分, 每个分开的函数叫做不完全函数,每次函数调用叫做不完全调用,这种函数调用的特点是每次调用都返回一个函数, 直到得到最终运行结果位置,for example,将对函数f(1,2,3,4,5,6)的调用修改为等价的f(1,2)(3,4)(5,6), 后者包含三次调用,和每次调用相关的函数就是“不完全函数” */
//第一种 function partialUsingArguments(fn) { var args = Array.prototype.slice.call(arguments,1); return fn.bind(this, args[0],args[1]); } //第二种 function partialUsingArguments(fn) { var slice = Array.prototype.slice; var args = slice.call(arguments, 1); return function() { return fn.apply(this, args.concat(slice.call(arguments))); } }
function partialUsingArguments(fn) { //先获取p函数第一个参数之后的全部参数 var args = Array.prototype.slice.call(arguments,1); //声明result函数 var result = function(){ //使用concat合并两个或多个数组中的元素 return fn.apply(null, args.concat([].slice.call(arguments))); } return result; }
function partialUsingArguments(fn) { var args = [].splice.call(arguments,1); if ( args.length < fn.length ) { return function() { return fn.apply(null, [].concat.call(args, [].slice.call(arguments))); } } else { return fn.apply(null, args.slice(0,fn.length)); } }
function partialUsingArguments(fn) { //外层函数的参数,除了第一个参数fn外,剩下的保存成真正的数组arg1 var arg1 = Array.prototype.slice.call(arguments,1); return function result(){ //内层函数的参数arguments保存成数组arg2 var arg2 = Array.prototype.slice.call(arguments,0); //数组拼贴成一个args,以便传给fn var args = arg1.concat(arg2); return fn.apply(null,args); }; }