2010-02-10 11 views
5

¿Tengo que atar? alguna función que requiere argumentos. La solución que uso es envolviendo la función para unir dentro de una función anónima.Javascript previene la función anónima?

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

¿Hay una manera más elegante de hacer esto?

+0

Su sintaxis es incorrecta; querías decir 'function() {foo (abc); }) ' – SLaks

+0

Gracias, cambió – Jacco

Respuesta

10

Se puede hacer una curryer, así:

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

Uso:

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

alternativa:

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

Uso:

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

gran idea, gracias +1 –

+0

¿Debería ser deletreado currier? – SLaks

+0

Nunca pensé que JavaScript empezara a tener hambre ... –

-2

incluso puede tomar un vistazo a algunas librerías js

por ejemplo YUI

lo que haces

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

Esto no responde la pregunta. – SLaks

1

Eso está bien. Lo que tienes es esencialmente el uso de un callback o "delegado".

La rasante de SLaks es un buen azúcar sintáctico si tiene que hacer esto a menudo dentro de un script.

0

Entonces, en su código tiene una función foo() que toma un evento como argumento? Si eso es todo lo que quieres hacer, entonces su attachEventHandler() puede escribirse tal como:

attachEventHandler(elementId, 'click', foo); 

lo que está pasando allí es que en lugar de foo llamando al() que está pasando una referencia a foo().

¿Está más cerca de lo que estás pensando?

+0

Parece estar intentando curry parámetros; Creo que el parámetro 'abc' en su método anónimo solo está allí por error. – SLaks

1

Puede ocultar la función de palabra si prefiere 'curry', pero su método original hace lo mismo sin la sobrecarga.

No es necesario el argumento entre paréntesis en el Función- anónima todavía está en su alcance cuando se define IT

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

En realidad, poner el argumento entre paréntesis no es lo mismo.Su código original (antes de editar la pregunta) pasaría el objeto de evento que se le da a la función anónima a 'foo'. – SLaks

+0

Esta pregunta no se trata de pasar un evento, por lo tanto, en este caso su respuesta es perfecta. Si tuviera que aprobar un evento, la primera solución sería diferente de la segunda. – Jacco

Cuestiones relacionadas