用可变参数调用函数指针?

时间:2015-07-09 18:51:32

标签: javascript

我想做这样的事情:

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);

我知道委托()做我想写的东西。如何编写适用于上述示例的委托()?

3 个答案:

答案 0 :(得分:3)

将所有参数传递给.applyarguments

function delegate(func) {
    var args = [].slice.call(arguments, 1);
    return func.apply(this, args);
}

演示:http://jsfiddle.net/DerekL/8xkhrtg7/

答案 1 :(得分:2)

我会戴着ES6风味的例子把帽子扔进戒指。我也使用bind而不是callapply来延迟函数调用。

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