2010-02-10 39 views
5

Spesso devo legare? alcune funzioni che richiedono argomenti. La soluzione che utilizzo è il wrapping della funzione per legare all'interno di una funzione anonima.Javascript impedisce la funzione anonima?

function foo(arg_0) { 
    // do stuff with: arg_0 
} 

function bar() { 
    var abc; 
    // stuff happens 
    abc = 'some value'; 
    attachEventHandler(elementId, 'click', function(){foo(abc);}); 
} 
bar(); 

C'è un modo più elegante di fare questo?

+0

tua sintassi è sbagliata; intendevi 'function() {pippo (abc); }) ' – SLaks

+0

Grazie, cambiato – Jacco

risposta

10

È possibile effettuare una curryer, come questo:

function curry(func) { 
    var functionArgs = Array.prototype.slice.call(arguments, 1); 
    return function() { return func.apply(this, functionArgs); }; 
} 

Usage:

attachEventHandler(elementId, 'click', curry(foo, abc)); 

alternativa:

Function.prototype.curry = function() { 
    var func = this, functionArgs = arguments; 
    return function() { return func.apply(this, functionArgs); }; 
} 

Usage:

attachEventHandler(elementId, 'click', foo.curry(abc)); 
+2

ottima idea, grazie +1 –

+0

Dovrebbe essere scritto più tradizionale? – SLaks

+0

Non avrei mai pensato che JavaScript avrebbe iniziato a farmi affamato ... –

-2

si potrebbe anche voler prendere un'occhiata ad alcuni js librerie

ad esempio YUI

quello che fai

YUI().use('node',function(Y){ 
    Y.one("#elementID").on('click', function(){ 
    // do your stuff here 
    }); 
}); 
+0

Questo non risponde alla domanda. – SLaks

1

va bene. Quello che hai è essenzialmente l'uso di un callback o "delegato". curryer

SLaks' è qualche bel zucchero sintattico se si deve fare questo, spesso all'interno di uno script.

0

Quindi nel codice si ha una funzione foo() che accetta un evento come argomento? Se questo è tutto quello che vogliamo fare allora il vostro attachEventHandler() può essere scritta come:

attachEventHandler(elementId, 'click', foo); 

Che cosa sta succedendo lì è che invece di chiamare foo() è il superamento di un riferimento a foo().

E 'più vicino a quello che stai pensando?

+0

Sembra che stia provando a curry i parametri; Credo che il parametro 'abc' nel suo metodo anonimo sia solo lì per errore. – SLaks

1

è possibile nascondere la funzione di parola, se si preferisce 'curry', ma il vostro metodo originale fa la stessa cosa senza il sovraccarico.

Non è necessario l'argomento tra le parentesi nel FUNCTION- anonima è ancora di portata quando si definisce it-

abc = 'some value'; 
attachEventHandler(elementId, 'click', function(abc){foo(abc);}) 
could be: 
attachEventHandler(elementId, 'click', function(){foo(abc)}); 
+0

In realtà, l'argomento tra parentesi non è lo stesso.Il suo codice originale (prima di modificare la domanda) passerebbe l'oggetto evento che è dato alla funzione anonima a 'pippo'. – SLaks

+0

Questa domanda non riguardava il passaggio di un evento, quindi, in questo caso, la tua risposta è azzeccata. Se dovessi passare un evento, la prima soluzione sarebbe diversa dalla seconda. – Jacco

Problemi correlati