2013-07-07 12 views
11

Jak przekazać argumenty z funkcji do innej funkcji?Jak przekazywać argumenty funkcji "wszystko oprócz pierwszego argumentu" funkcji do innej funkcji?

mam to:

function SomeThing(options) { 
    function callback(callback_name) { 
    if(options[callback_name]) { 
     // Desiring to call the callback with all arguments that this function 
     // received, except for the first argument. 
     options[callback_name].apply(this, arguments); 
    } 
    } 
    callback('cb_one', 99, 100); 
} 

Co dostaję w a argumentem jest „cb_one”, ale chcę, że powinno być „99”.

var a = new SomeThing({ 
    cb_one: function(a,b,c) { 
    console.log(arguments); // => ["cb_one", 99, 100] 
    console.log(a);   // => cb_one 
    console.log(b);   // => 99 
    console.log(c);   // => 100 
    } 
}); 

Jak to zrobić?

Odpowiedz

22

Zastosowanie options[callback_name].apply(this, [].slice.call(arguments,1));

[].slice.call(arguments,1) przetwarza argumenty ('array-like') Object w prawdziwy Array zawierającej wszystkie argumenty, ale pierwszy.

[].slice.call może być również zapisany jako Array.prototype.slice.call.

+5

To może być wyraźniejszy zamiast to zrobić używać 'Array.prototype.slice.call' zamiast' [] .slice.call' - to pokazuje, że nie ma nic szczególnego w pustej tablicy. –

1

Możesz zrobić to, co robi Kooilnc. Osobiście jednak nie lubię pisać: [].slice.call lub Arrray.prototype.slice.call.

var bind = Function.bind; 
var call = Function.call; 

var bindable = bind.bind(bind); 
var callable = bindable(call); 

// this is the same as Array.prototype.slice.call 
var arrayFrom = callable(Array.prototype.slice); 

Teraz możesz proste zrób::

options[callback_name].apply(this, arrayFrom(arguments, 1)); 

Aby uzyskać więcej informacji o bindable i callable rozmawiać z ludźmi w JavaScript czacie: http://chat.stackoverflow.com/rooms/17/javascript

+0

Dlaczego "bindable"? Po prostu wykonaj 'var slice = Function.call.bind (Array.prototype.slice);' – 1983

+0

Ponieważ w 5 liniach kodu otrzymujesz 3 przydatne funkcje - 'bindable',' callable' oraz 'arrayFrom', które mogą być używane w wielu różne przypadki. Na przykład mogę użyć 'bindable' na' apply', aby utworzyć funkcję 'appliable' która przyjmuje funkcję' func' i zwraca inną funkcję równoważną 'func.apply'. Ponadto wygląda po prostu czystsze. –

+0

@NagaJolokia Ups. Zapomniałem wspomnieć o Tobie w ostatnim komentarzu. –

Powiązane problemy