一、题目描述
实现函数 callIt,调用之后满足如下条件
1、返回的结果为调用 fn 之后的结果
2、fn 的调用参数为 callIt 的第一个参数之后的全部参数
示例1
输入
无
输出
无
arguments并非真正的数组,因此要获得callIt的第一个参数之后的所有参数,不能直接使用slice方法截取,需要先将arguments转换为真正的数组才行。有两种常见的方法:
- 使用slice方法:var args = Array.prototype.slice.call(arguments);
- 循环遍历逐一填入新数组。在获得了args之后,就可以调用apply来执行传入的函数参数。
1.Array.prototype.slice.call(arguments,1)
function callIt(fn) {
//将arguments转化为数组后,截取第一个元素之后的所有元素
var args = Array.prototype.slice.call(arguments,1);
//调用fn
var result = fn.apply(null,args);
return result;
}
或者:
function callIt(fn) {
return fn.apply(this,[].slice.call(arguments,1));
}
2.循环遍历
function callIt(fn) {
var args=[];
for(var i=1;i<arguments.length;i++){
args.push(arguments[i]);
}
var result=fn.apply(null,args);
return result;
}
3.获取全部参数,然后去掉第一个
function callIt(fn) {
var arr=Array.prototype.slice.call(arguments);
arr.shift();
return fn.apply(this,arr);
}
二、题目描述
实现函数 partialUsingArguments,调用之后满足如下条件:
1、返回一个函数 result
2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数
示例1
输入
无
输出
无
arguments不能用slice方法直接截取,需要先转换为数组,var args = Array.prototype.slice.call(arguments);
合并参数可以使用concat方法,并且也需要将arguments先转换为数组才能使用concat进行合并。最后使用apply执行传入的函数即可。
function partialUsingArguments(fn) {
var arr=[].slice.call(arguments,1);
var result=function(){
var arr1=[].slice.call(arguments);
return fn.apply(this,arr.concat(arr1));
}
return result;
}