2015-07-09 7 views
1

Я хочу сделать что-то вроде этого:Указатель функции вызова с переменными аргументами?

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

Я знаю, что делегат() будет не делать то, что я хочу, как написано. Как я могу написать делегат(), который будет работать для вышеуказанных примеров?

+1

Ищите документацию по 'arguments'. – elclanrs

+0

[аргументы MDN] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments). – fuyushimoya

ответ

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 
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' 
+0

Я знал, что кто-то собирается ответить ES6 на этот вопрос! –

+1

Ха-ха, '[] .slice.call (arguments, 1);' просто просит его. '... args' выглядит намного лучше! – rgbchris

Смежные вопросы