2009-01-19 21 views

Respuesta

436

Necesita crear una función anónima para que la función real no se ejecute de inmediato.

setInterval(function() { funca(10,3); }, 500); 
+3

¿Qué debería ser para el parámetro dinámico? – rony36

+21

@ rony36 - es probable que desee tener una función que cree el temporizador de intervalo para usted. Pase el parámetro a la función para que su valor sea capturado en el cierre de la función y retenido para cuando el temporizador expire. 'function createInterval (f, dynamicParameter, interval) {setInterval (function() {f (dynamicParameter);}, interval); } 'Entonces llámalo como' createInterval (funca, dynamicValue, 500); 'Obviamente puedes extender esto para más de un parámetro. Y, por favor, use nombres de variables más descriptivos. :) – tvanfosson

+2

@tvanfosson - ¿Cómo borrar este tipo de intervalo? – Yong

34

Agregar como parámetros a setInterval:

setInterval(funca, 500, 10, 3); 

La sintaxis en su pregunta utiliza eval, que no se recomienda la práctica.

+6

Esto no funcionará en Internet Explorer. – Kev

+1

¿Qué? ¿Desde cuándo fue permitido? (pregunta seria) –

+1

No estoy seguro. Mi fuente fue: https://developer.mozilla.org/en/DOM/window.setInterval – Kev

16

Puede usar una función anónima;

setInterval(function() { funca(10,3); },500); 
+1

¡esta es una llamada bastante cara! – Roylee

+0

@Roylee ¿Cómo es caro? – Xufox

0

Esto funciona setInterval("foo(bar)",int,lang); .... Jon Kleiser me conducen a la respuesta.

29

Puede pasar el parámetro (s) como una propiedad del objeto función, no como un parámetro:

var f = this.someFunction; //use 'this' if called from class 
f.parameter1 = obj; 
f.parameter2 = this; 
f.parameter3 = whatever; 
setInterval(f, 1000); 

Luego, en función de su someFunction, usted tendrá acceso a los parámetros. Esto es particularmente útil en clases donde el alcance va al espacio global automáticamente y usted pierde referencias a la clase que llamó setInterval para comenzar. Con este enfoque, "parameter2" en "someFunction", en el ejemplo anterior, tendrá el alcance correcto.

+0

Puede acceder por Classname.prototype.someFunction.parameter1 – JoaquinG

+2

Agregar parámetros a un objeto o función puede hacer que el compilador se ralentice, ya que tendrá que reconstruir su representación de código nativo del objeto (por ejemplo, si esto se hizo en un loop) así que ten cuidado. – mattdlockyer

5

Citando los argumentos debe ser lo suficientemente:

OK --> reloadIntervalID = window.setInterval("reloadSeries('"+param2Pass+"')" , 5000) 

KO --> reloadIntervalID = window.setInterval("reloadSeries("+param2Pass+")" , 5000) 

Nota de la comilla simple ' para cada argumento.

Probado con IE8, Chrome y Firefox

+6

Usar eval es una práctica terrible. El uso de la función anónima es mucho mejor. – SuperIRis

56

ahora con ES5, se unen método de la función prototipo:

setInterval(funca.bind(null,10,3),500); 

Reference here

+1

Esta es la mejor respuesta, sin embargo, puede tener un comportamiento inesperado dependiendo de la función. p.ej. '' console.log.bind (null) ("Log me") '' lanzará '' invocación ilegal'', pero '' console.log.bind (console) ("Log me") '' funcionará como se esperaba . Esto se debe a que '' console.log'' requiere '' console'' como '' this'' arg. – Indy

+1

De lejos, la mejor respuesta. Delgado y limpio. ¡Muchas gracias! – Tobi

+0

¡Muy limpio y eficiente! – contactmatt

12
 setInterval(function(a,b,c){ 

      console.log(a + b +c); 

     }, 500, [1],[2],[3]); 

      //note the console will not print 6 
      // rather it will print 123 in every 500 ms 
      // because arguments are passed as array not as numbers 
      // tested in node.js ie 11 and chrome 
+0

Respuesta mejor explicada. –

+0

Entonces, ¿por qué pasar los argumentos como matrices? Este detalle ni siquiera se relaciona con la pregunta. – Xufox

0

Otra solución consiste en pasar su función como esa (si tienes variables dinámicas): setInterval ('funca (' + x + ',' + y + ')', 500);

-1

Puede usar una biblioteca llamada subrayado js. Da una buena envoltura en el método bind y es una sintaxis mucho más limpia también. Permitiéndole ejecutar la función en el alcance especificado.

http://underscorejs.org/#bind

_.bind (función, alcance, * argumentos)

10
setInterval(function,milliseconds,param1,param2,...) 
-2

Adición parenthesizes después función anónima parece hacer el truco:

function clock() { 
    n = 10; 

    while(--n) { 
     setInterval(function() { 
      console.log(n); 
     }(n), 1000); 
    } 
} 
+1

Su código ejecutará la función pero no le aplicará la demora, puede eliminar las líneas que rodean 'console.log (n)' y obtendrá exactamente el mismo resultado. –

0

Sé que este tema es tan viejo, pero aquí está mi solución sobre pasar parámetros en la función setInterval.

HTML:

var fiveMinutes = 60 * 2; 
var display = document.querySelector('#timer'); 
startTimer(fiveMinutes, display); 

JavaScript:

function startTimer(duration, display) { 
    var timer = duration, 
     minutes, seconds; 

    setInterval(function() { 
     minutes = parseInt(timer/60, 10); 
     seconds = parseInt(timer % 60, 10); 

     minutes = minutes < 10 ? "0" + minutes : minutes; 
     seconds = seconds < 10 ? "0" + seconds : seconds; 

     display.textContent = minutes + ":" + seconds; 
     --timer; // put boolean value for minus values. 

    }, 1000); 
} 
9

Con mucho, la respuesta más práctica es la dada por tvanfosson, todo lo que puedo hacer es darle una versión actualizada con ES6:

setInterval(()=>{ funca(10,3); }, 500); 
+1

¿Estás diciendo que() => {} es la nueva forma de ES6 de reemplazar function() {}? Interesante. Primero, pensé que los cohetes eran pasados. Y, a menos que esta sintaxis tenga otros usos comunes, es muy, muy extraño. Veo que son "flechas gordas". Aún así, extraño. Supongo que a alguien le gusta y es una cuestión de opinión. –

Cuestiones relacionadas