2009-08-19 26 views
91

¿Es posible pasar una función javascript con parámetros como parámetro?Pasar una función con parámetros como parámetro?

Ejemplo:

$(edit_link).click(changeViewMode(myvar)); 
+4

Parece que jQuery, y lo más probable es, pero eso es irrelevante.El uso o los parámetros y las funciones son los mismos independientemente de las bibliotecas de Javascript que utilice. – Guffa

+0

@Guffa - Me preguntaba si debería etiquetarse con jQuery –

+1

@Lucia Considere cambiar la respuesta aceptada a [this] (http://stackoverflow.com/a/34567019/3853934). –

Respuesta

175

utilizar un "cierre":

$(edit_link).click(function(){ return changeViewMode(myvar); }); 

Esto crea una envoltura temporal función anónima que sabe sobre el parámetro y lo pasa a la implementación real de devolución de llamada.

+2

Si quiere invocar una función en un objeto, debe llamar a bind(). myObj.click (function() {this.doSomething();} .bind (myObj)); Eso hará que "esto" sea myObj. – Eli

+0

¿No es esto un problema de rendimiento cuando se trata de muchos de estos? P.ej. Estás renderizando un onPress en una fila y tienes 10,000 filas. Esto crea una nueva envoltura de función temporal anónima para cada fila. ¿Hay alguna otra forma de hacerlo? –

+0

@JoshuaPinter La técnica en sí no es un problema. Si necesita la misma función llame a 10.000 veces, puede simplemente guardar el contenedor en una variable, por lo que solo debe crearlo una vez. Si necesita pasar 10.000 contextos diferentes, es poco lo que puede hacer. Tenga cuidado con la optimización prematura: como siempre con el rendimiento, necesita * medir * para ver si hay un problema o no. Los motores de JavaScript actuales son muy potentes y podrían optimizar el código de maneras sorprendentes. –

8

Sí, como este:

$(edit_link).click(function() { changeViewMode(myvar) }); 
14

No, pero puede pasar una sin parámetros, y hacer esto:

$(edit_link).click(
    function() { changeViewMode(myvar); } 
); 

Así que estás pasando una función anónima sin parámetros, que función luego llama a su función parametrizada con la variable en el cierre

29

Use Function.prototype.bind(). MDN Citando:

El método bind() crea una nueva función que, cuando se llama, tiene su palabra clave this establecido en el valor proporcionado, con una secuencia dada de los argumentos anteriores cualquier proporcionan cuando la nueva función se llama.

Es compatible con todos los principales navegadores, incluido IE9 +.

El código debería tener este aspecto: Nota

$(edit_link).click(changeViewMode.bind(null, myvar)); 

lateral: Asumo que usted está en el contexto global, es decir this variable es window; de lo contrario, use this en lugar de null.

+0

Gracias, esto me ayudó. Lo usé así: '$ .ajax (url) .done (handler.bind (this, var1, var2));' – Thomas

+1

¿Qué opción es la mejor? ¿Usar el cierre o usar la función de enlace? Por favor, avíseme si hay algún impacto en el rendimiento – Varun

+3

@Varun See [¿Por qué unir es más lento que un cierre?] (Http://stackoverflow.com/questions/17638305/why-is-bind-slower-than-a-closure) –

2

Usted puede hacer esto

var message = 'Hello World'; 

var callback = function(){ 
alert(this) 
}.bind(message); 

y luego

function activate(callback){ 
    callback && callback(); 
} 

activate(callback); 

O si su devolución de llamada contiene la lógica más flexible que puede pasar objeto.

Demo

1

Este es un ejemplo siguiente enfoque de Ferdinand Beyer:

function function1() 
{ 
    function2(function() { function3("parameter value"); }); 
} 
function function2(functionToBindOnClick) 
{ 
    $(".myButton").click(functionToBindOnClick); 
} 
function function3(message) { alert(message); } 

En este ejemplo el "valor del parámetro" se pasa de function1 a FUNCTION3 través function2 usando una envoltura de función.

0

O si está utilizando es6 usted debería ser capaz de utilizar una función de flecha

$(edit_link).click(() => changeViewMode(myvar)); 
Cuestiones relacionadas