首页 > 试题广场 >

二次封装函数

[编程题]二次封装函数
  • 热度指数:39465 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
已知函数 fn 执行需要 3 个参数。请实现函数 partial,调用之后满足如下条件:
1、返回一个函数 result,该函数接受一个参数
2、执行 result(str3) ,返回的结果与 fn(str1, str2, str3) 一致

输入描述:
var sayIt = function(greeting, name, punctuation) {     return greeting + ', ' + name + (punctuation || '!'); };  partial(sayIt, 'Hello', 'Ellie')('!!!');


输出描述:
Hello, Ellie!!!
示例1

输入

var sayIt = function(greeting, name, punctuation) {     return greeting + ', ' + name + (punctuation || '!'); };  partial(sayIt, 'Hello', 'Ellie')('!!!');

输出

Hello, Ellie!!!
function partial(fn, str1, str2) {
    return result = function(str3){
        return fn(str1,str2,str3)
    }
}
发表于 2021-05-31 17:03:04 回复(0)
function partial(fn, str1, str2) {
    var result = function(str3) {
        return fn(str1, str2, str3)
    }
    return result;
}


发表于 2021-04-02 18:22:38 回复(0)
function partial(fn, str1, str2) {

    /**
    var sayIt = function(greeting, name, punctuation) {
    return greeting + ', ' + name + (punctuation || '!');
    };
    */
    
    return function(str3){
        return fn(str1,str2,str3)
    }
}


函数作为参数传递或返回 的话,称之为高阶函数
发表于 2021-04-01 00:52:09 回复(0)
function partial(fn, str1, str2) {
    return function (val) {
        return fn(str1, str2, val);
    }
}
采用了这种方式来实现的。
发表于 2020-07-18 17:46:44 回复(0)
function partial(fn, str1, str2) {    
  const args = Array.prototype.slice.call(arguments, 1);
  return function () {
    return fn.apply(this, args.concat(Array.prototype.slice.call(arguments)));
  };
}

// 或者
function partial(fn, str1, str2) {
  const args = [...arguments].slice(1);
  return function () {
    return fn.apply(this, [...args, ...arguments]);
  };
}

编辑于 2020-05-04 10:59:29 回复(0)
function partial(fn, str1, str2) {
    var result=(str3)=>fn(str1,str2,str3)
    return result
}
感觉出题人有点无聊。。。
发表于 2020-04-07 19:20:46 回复(1)
function partial(fn, str1, str2) {
    function result(str3){
        return fn(str1,str2,str3);
    }
    return result;
}

 //这不是最简单最好理解的么
发表于 2019-10-21 20:46:28 回复(0)
function partial(fn, str1, str2) {
    var result = function(str3) {
        return fn(str1,str2,str3);
    };
    return result;
}
发表于 2018-11-23 16:04:15 回复(0)
function partial(fn, str1, str2) {
    var result=function(str3){
        return fn.call(this,str1,str2,str3);
    }
    return result;
}
发表于 2018-06-21 15:30:44 回复(0)
function partial(fn, str1, str2) {
var result = function(str3){
return function(){
return fn(str1,str2,str3);
};
}(str1,str2);
return result;
}
IDE上能跑出来正确结果。 为什么不能通过呢???
发表于 2018-04-01 21:44:43 回复(0)
// call和apply必须显式地调用str3,立即执行
// bind不是立即执行,未传入str3时,并未执行,只是返回一个函数,等待参数传入
// this用于上下文不确定的情况

// call
function partial(fn, str1, str2) {
    function result(str3) {
        return fn.call(this, str1, str2, str3);
    }

     return result;
}

// apply(这里只是为了对照)
function partial(fn, str1, str2) {
    function result(str3) {
        return fn.apply(this, [str1, str2, str3]);
    }

    return result;
}

// 这个bind会生成一个新函数(对象), 它的str1, str2参数都定死了, str3未传入, 一旦传入就会执行
function partial(fn, str1, str2) {
    return fn.bind(this, str1, str2); // 或 return fn.bind(null, str1, str2);
}

// bind同上, 多了一步, 把str3传入的过程写在另一个函数里面, 
// 而另一个函数也有str1, str2参数
// 此法有种多次一举的感觉,但是表示出了后续的调用。
function partial(fn, str1, str2) {
    function result(str3) {
        return fn.bind(this, str1, str2)(str3);
    }

    return result;
}

// 匿名函数,默认this绑定global,与bind的第一个参数为this时效果一样。
function partial(fn, str1, str2) {
    return function(str3) {
        return fn(str1, str2, str3);
    }
}

// ES6。this指向undefined.
const partial = (fn, str1, str2) => str3 => fn(str1, str2, str3);

编辑于 2017-08-19 14:47:00 回复(25)
// 函数curry化
function partial(fn, str1, str2) {
    var oldArgs =  [].slice.call(arguments,1);
    return function(s){
        var newArgs = oldArgs.concat([].slice.call(arguments))
        return fn.apply(this,newArgs);
    }
}
发表于 2016-11-17 15:15:28 回复(0)
function partial(fn, str1, str2) {
    return function(str3){   
        return fn.call(null,str1,str2,str3); 
    };
}
        
      
   
编辑于 2016-08-05 20:02:09 回复(0)