我想做这样的事情:
function delegate(func, params) {
func(params);
}
function foo(a, b) {
// do stuff
}
function bar(x, y, z) {
// do stuff
}
delegate(foo, 1, 2);
delegate(bar, 1, 2, 3);
我知道委托()不做我想写的东西。如何编写适用于上述示例的委托()?
答案 0 :(得分:3)
function delegate(func) {
var args = [].slice.call(arguments, 1);
return func.apply(this, args);
}
答案 1 :(得分:2)
我会戴着ES6风味的例子把帽子扔进戒指。我也使用bind
而不是call
或apply
来延迟函数调用。
function delegate(fn, ...args) {
if (args.length !== fn.length) {
console.log(`Warning, function ${fn.name} takes ${fn.length} arguments.`);
return;
}
return fn.bind(null, args);
}
function foo(a, b) {
console.log('foo invoked');
}
function bar(a, b, c) {
console.log('bar invoked');
}
var whoops = delegate(foo, 1, 2, 3); // => 'Warning, function foo takes 2 arguments.'
var myFn1 = delegate(foo, 1, 2);
var myFn2 = delegate(bar, 1, 2, 3);
myFn1(); // => 'foo invoked'
myFn2(); // => 'bar invoked'
答案 2 :(得分:1)
如果您仍然遇到问题,可以创建如下函数:
function delegate(func) {
var args = Array.prototype.slice.call(arguments, 1);
return func.apply(null, args);
}
那应该做你想要的。
// Examples
function sum(x, y) {
return x + y;
}
function sumThree(x, y, z) {
return x + y + z;
}
delegate(sum, 4, 5);
//=> 9
delegate(sumThree, 1, 2, 3);
//=> 6