实现函数 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);
};
}