实现 Function.prototype.apply 函数

Implement the Function.prototype.apply function?

本文关键字:函数 apply prototype Function 实现      更新时间:2023-09-26

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

apply(fn, args) => fn(args[0], args[1], ..., args[args.length-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' ]
);

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

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
    }
}

使用 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);
    }

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