实现 Function.prototype.apply 函数
Implement the Function.prototype.apply function?
我不太关心上下文,也不想使用 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);
}
请不要使用这是现实生活!
相关文章:
- Javascript:如何获取函数.apply()的键
- 是否可以在不更改上下文的情况下调用函数.apply
- 如何通过 Function.prototype.apply() 更改调用函数的参数
- 通过fn.apply或fn.bind将函数传递给setTimeout
- 了解窗口调整大小事件与 scope.$apply 与函数$watch
- 节点redis't喜欢函数.apply()
- 未捕获的类型错误:hook.apply不是在react路由器中使用onEnter时的函数
- 函数式编程 - .bind.apply for curry function.
- JS:.apply(null,arguments)——为什么我的函数被调用一次,而console.log被调用多次
- 函数 (){ 返回 fn.apply(me, arguments); } 作为回调
- 将函数绑定到baz后调用fn.apply(bar,[])
- 使用数组-apply()中的参数调用函数,但不使用上下文参数
- 类型错误: $scope.apply 不是一个函数
- $.when.apply.done 不执行异步函数
- node.js 使用 function.prototype.apply 执行的泛型函数
- KNOCKOUT.js问题:“H.apply不是一个函数.(在'h.apply(e,r)'中,'
- 如果不在Angular.js中使用$apply(),我该如何编写此函数
- 更新'这'当返回用.apply()调用的函数时,从回调
- Uncatch TypeError: pos.apply 不是 showtooltip() 方法中的函数
- Ajax 调用和函数.apply infinite loop.