首页 > 试题广场 >

二次封装函数

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

输入

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

输出

Hello, Ellie!!!
实际考察bind的用法,普适抽象写法:
        Function.prototype._bind = function () {
            var _this = this,
                context = [].shift.call(arguments),
                args = [].slice.call(arguments);
            if (args.length < _this.length) {
                return function () {
                    return _this.apply(context, [].concat.call(args, [].slice.call(arguments)));
                }
            } else {
                console.log(args.slice(0, _this.length));
                return _this.apply(context, args.slice(0, _this.length));
            }
        }

        var test2 = {
            name: 'hi there'
        };


        var fn3 = function (a, b, c, d) {
            return this.name + a + b + c + d;
        }._bind(test2, 1, 2);
        console.log( fn3(3, 4) ); //hi there 1 2 3 4

发表于 2017-03-14 18:44:03 回复(0)
function partial(fn, str1, str2) {
    let result = function(str) {
        return fn(str1,str2,str);
    }
    return result;
}

发表于 2022-03-27 21:31:06 回复(0)
function partial(fn, str1, str2) {
    return result = function (str3) {
        return fn(str1, str2, str3);
    }
}

发表于 2022-01-07 09:27:47 回复(0)
function partial(fn, str1, str2) {
    return str3 => fn(str1, str2, str3);
}

发表于 2021-07-30 14:53:56 回复(0)
function partial(fn, str1, str2) {
    var args = Array.prototype.slice.call(arguments, 1);
    return function(){
        return fn.apply(null, args.concat(Array.prototype.slice.call(arguments)))
    }
}

发表于 2018-10-09 17:28:34 回复(0)
function partial(fn, str1, str2) {
  return fn.bind(null, str1, str2);
}
发表于 2018-03-30 15:18:03 回复(0)
//对闭包的考查
function partial(fn, str1, str2) {
    var fn1 = function(a, b){
        return function(c){
            return fn(a, b, c);
        }
    }(str1, str2)
    
    return fn1;
}

发表于 2017-09-09 22:16:19 回复(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)

partial(sayIt, 'Hello', 'Ellie')('!!!');首先执行partial(sayIt, 'Hello', 'Ellie'),将参数传入,然后返回函数result与('!!!')组合成result('!!!')执行。于是,可以在result函数里调用fn,因为函数的参数固定为三个,因此可以用call方法去调用函数fn。

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

编辑于 2015-08-19 10:37:57 回复(15)
function partial(fn, str1, str2) {
    
    var result=function(str3){
        return fn.bind(this,str1,str2)(str3);
    };
    return result;
}
bind不加后面的括号返回的是函数,加上后面的括号返回的是函数值,这也是bind和call和apply的主要区别,bind需要二次调用,而call和apply返回的是函数值,是直接调用。这道题让我更理解了三者的区别。
发表于 2016-08-21 15:05:24 回复(2)
//bind
function partial(fn, str1, str2) {
    return fn.bind(null,str1,str2);
}
//call
function partial(fn, str1, str2) {
    return function(str3){
        return fn.call(this,str1,str2,str3);
    }
}
//
function partial(fn, str1, str2) {
    return function(str3){
        return fn(str1,str2,str3);
    }
}

发表于 2016-08-29 13:18:15 回复(1)
function partial(fn, str1, str2) {
    var result=(str3)=>fn(str1,str2,str3)
    return result
}
感觉出题人有点无聊。。。
发表于 2020-04-07 19:20:46 回复(1)
toy头像 toy
function partial(fn, str1, str2) {
    var result=function(str3){
        return fn.call(null,str1,str2,str3);
    }
    return result;
} 

发表于 2016-04-02 21:52:12 回复(0)
function partial(fn, str1, str2) {
  return (str3) => fn(str1, str2, str3)
}
ES6 箭头函数
发表于 2021-08-01 10:54:56 回复(0)
function partial(fn, str1, str2) {
	var result = function(str1,str2){
       return function(str3){
           return fn(str1,str2,str3);
       }
    }(str1,str2);
    return result;
}

测试通过!
又是对闭包的考察!

发表于 2017-04-10 15:53:47 回复(0)
function partial(fn, str1, str2) {
    return function(){
      var str3 = arguments[0]
      return fn.call(this,str1,str2,str3)
    }
}
发表于 2016-11-18 23:46:13 回复(0)
// 函数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(this,str1,str2,str3)
        }
}
发表于 2022-11-15 21:14:32 回复(0)
function partial(fn, str1, str2) {
    return (s)=>fn(str1, str2,s)
}
发表于 2021-09-28 17:48:02 回复(0)
function partial(fn, str1, str2) {
  var result = function(str3){
         return fn.call(this, str1, str2, str3);
     }
     return result;
 }

发表于 2020-03-25 11:51:54 回复(0)