实现Function.prototype.apply函数?

时间:2015-06-18 16:52:22

标签: javascript functional-programming

我不太关心上下文,我不想使用Function()。该函数应该采用函数和参数数组。实施例

apply(fn, args) => fn(args[0], args[1], ..., args[args.length-1]);

甚至可能吗?

3 个答案:

答案 0 :(得分:1)

var apply = function(fn, args) {
  var _fn = fn;
  args.forEach(function(arg) {
    _fn = _fn.bind(null, arg);
  });
  return _fn();
};

apply(
  function() { console.log(arguments); },
  [ 'arg 1', 'arg 2', 'arg 3', 'arg 4' ]
);

答案 1 :(得分:0)

如果您不知道args的数量,那么这是唯一的方法:

function apply(fn, args) {
    return fn.apply(null, args);
}

如果您知道号码(比如2):

function apply(fn, args) {
    return fn(args[0], args[1]);
}

或者:

function apply(fn, args) {

    switch (args.length) {
        case 0:
            return fn();
        case 1:
            return fn(args[0]);
        case 2:
            return fn(args[0], args[1]);
        case 3:
            return fn(args[0], args[1], args[2]);
        // etc
    }
}

答案 2 :(得分:0)

使用eval有一个非常讨厌的解决方案:

function apply(fn, args) {

    var a = [];
    for (var i = 0; i < args.length; i++){
        a.push("args["+i+"]");
    }

    command_string = "function inner_apply(fn, args) { return fn(" + a.join(",") + ");} ";

    eval(command_string);
    return inner_apply(fn, args);
    }

请永远不要使用这是现实生活!