2011-08-24 16 views
7

Tengo una función llamada "tryMe" y la estoy llamando sin el paréntesis no precisamente esto, pero la idea es como lo que harías aquí:Cómo pasar parámetros cuando se llama a una función sin el paréntesis [Javascript]

setTimeout(tryMe,200); 

¿cómo puedo pasar los parámetros que necesito?

Estoy usando un complemento jquery que me permite llamar a una función, pero tengo que llamarla sin el paréntesis o se ejecuta al cargar.

+1

Se ejecuta porque la función se evalúa y el resultado de la función se pasa a 'setTimeout'; La función en sí no se pasa como está esperando. – Marc

+2

No es preciso describir lo que está haciendo como "llamar a una función sin los paréntesis". La función no se llama en la declaración que publicó en su pregunta.Más bien, una * referencia * a su función se pasa a otra función ('setTimeout'), que en algún momento (200 milisegundos después, de hecho) llamará a su función ** con ** paréntesis (conceptualmente). Aún así, lo que estás preguntando aquí es un punto de confusión muy común, y la respuesta es apenas obvia. – Pointy

+0

@Pointy gracias por explicármelo =) – Tsundoku

Respuesta

11
setTimeout(function() { tryMe(parm1, parm2); }, 200); 

una oferta más robusta, para asegurar que los valores de parm1, parm2 no cambian antes de dispararse el tiempo de espera (por comentario de @ lincolnk):

setTimeout(function() { 
    var p1 = parm1; 
    var p2 = parm2; 
    tryMe(p1, p2); 
}, 200); 

@ patrick dw, tienes razón, tiene que ser evaluado antes.

+3

Solo asegúrese de no cambiar los valores de los parámetros antes de que se agote el tiempo de espera. – lincolnk

+1

Su actualización no se comportará de manera diferente a la original. Para garantizar los valores que estaban presentes cuando se llamó a 'setTimeout', necesitaría * invocar * una función, hacer referencia localmente en la función * that * y hacer que la función devuelva una función que haga referencia a las referencias definidas localmente. – user113716

+0

La manera más elegante es usar __setTimeout (tryMe.bind (window, parm1, parm2), 200); __. bind() no es compatible con IE8 o menos, pero se puede implementar con el equivalente de JavaScript. –

4

Puede envolver tryMe en un cierre.

Por ejemplo:

var f = function(){tryMe('some parameter');}; 
setTimeout(f, 200); 

Aquí, creamos un objeto de función, f, que llama tryMe con el parámetro (s) deseado. Luego pasamos f a setTimeout. Cuando expira el tiempo de espera, se llamará al f, que a su vez llamará al tryMe con los parámetros deseados.

Una palabra de advertencia si desea pasar en los parámetros que pueden cambiar antes de que el tiempo de espera es llamada (por ejemplo, si va a configurar varios tiempos de espera en un bucle for): tendrá que obligar a dichas variables, así:

var f = function(someParamter){return function(){tryMe(someParameter);};}; 
setTimeout(f(someParameter), 200); 

la razón simple hecho de hacer algo así como

setTimeout(tryMe('some parameter'), 200); //Does not work. 

no funciona es porque usted está pasando el resultado de evaluar tryMe en lugar del objeto función tryMe sí.

+0

Esta debería ser la respuesta correcta –

0

No está llamando a la función, el navegador sí, después de 200 milisegundos. Simplemente le proporciona la función que necesita ser llamada. Firefox realidad permite especificar parámetros adicionales en la llamada setTimeout:

setTimeout(tryMe, 200, "first parameter", "second parameter"); 

Sin embargo, en la medida que yo sepa no hay otros navegadores soportan esta función para que realmente debe utilizar una función de cierre según lo explicado por otras respuestas ya. Aquí crea una función temporal con el único propósito de llamar a su función original con los parámetros correctos.

setTimeout(function() {tryMe("first parameter", "second parameter")}, 200); 
Cuestiones relacionadas