首页 > 试题广场 >

二次封装函数

[编程题]二次封装函数
  • 热度指数:61743 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
实现函数 partialUsingArguments,调用之后满足如下条件:
1、返回一个函数 result
2、调用 result 之后,返回的结果与调用函数 fn 的结果一致
3、fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数
示例1

输入

输出

function partialUsingArguments(fn) {
    return fn.bind(this,...[].slice.call(arguments,1))
}
通过bind返回的还是一个函数,只不过是改变了this指针的函数,相比于apply和call,他不会立即执行,而且传参注意数组解构
发表于 2021-04-01 11:24:29 回复(0)
function partialUsingArguments(fn) {
    let args=Array.prototype.slice.call(arguments,1);
    return function result(){
        return fn.call(this,...args,...arguments)
    }
}
发表于 2021-01-18 18:06:39 回复(0)

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的第一个参数
}
发表于 2020-07-16 03:52:26 回复(0)
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
}

发表于 2020-04-09 09:43:35 回复(0)
function partialUsingArguments(fn) { let [c,...b]=[...arguments] let result =function(){ return fn(b.concat([...arguments]))
    } return result }
发表于 2019-11-11 10:35:37 回复(0)
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;
}

发表于 2019-04-09 17:09:58 回复(0)
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);
        }
    }
}

发表于 2019-02-18 10:41:56 回复(0)
function partialUsingArguments(fn) {
    var OuterArgs = Array.prototype.slice.call(arguments, 1);
    var res = function(){
        var resArgs = Array.prototype.slice.call(arguments);
        return fn.apply(null ,OuterArgs.concat(resArgs));
    }
    return res;
}
这么写就清晰了~
发表于 2018-07-05 15:56:53 回复(1)
因为题目说的是:fn 的调用参数为 partialUsingArguments 的第一个参数之后的全部参数以及 result 的调用参数
所以两个函数的参数都要涉及进去,不想把arguments转换为数组,可以用遍历,但需要两次
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;
}

发表于 2017-04-02 16:13:28 回复(0)
function partialUsingArguments(fn) {
var arr1=Array.prototype.slice.call(arguments,1);
    return function(){
        var arg=Array.prototype.concat.apply(arr1,arguments);//这里一定要用apply,要不就变成[1,2,[3,4]]了
        return fn.apply(this,arg);
    }
}
发表于 2017-03-24 23:23:35 回复(0)
不能用...args直接获取参数数组
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的处理方式就能通过
发表于 2017-03-17 19:43:02 回复(0)
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;
        });
    };
}

发表于 2017-03-15 23:08:25 回复(2)
function partialUsingArguments(fn) {
    var Args=[];
    for(var i=1;i<arguments.length;i++){
        Args.push(arguments[i]);
    }
    
    var result=function(){
    for(var i=0;i<arguments.length;i++){
        Args.push(arguments[i]);
    }    

        return fn.apply(this,Args);
    }
    return result;

}

发表于 2016-09-22 20:58:18 回复(0)