domingo, 17 de enero de 2010

Ejecutando funciones en un ámbito distinto con setInterval y setTimeout

A veces ocurre que necesitamos ejecutar una función tras un tiempo, o cada cierto intervalo de tiempo. Para la primera situación usamos setTimeout:
setTimeout("tu_funcion();", milisegundos);
y para la segunda setInterval:
setInterval("tu_funcion();", milisegundos);
Pero en ocasiones hay que cambiar el ámbito en el que se debe ejecutar la función, tras el intervalo de tiempo.

Por ejemplo, imaginemos el caso en el que estamos escribiendo el método de una clase y queremos ejecutar otro método de la misma clase (this.otro_metodo) tras ciertos milisegundos. Por tanto necesitamos que "otro_metodo()" se ejecute en el ámbito de "this". Para solucionar este caso, simplemente hay que usar las funciones de esta forma:
setTimeout(
function(thisObj){ 
    thisObj.otro_metodo(); 
}, milisegundos, this
);
La misma sintaxis sirve para setInterval.

Pero hay un pequeño problema, esto no funciona en explorer (vaya, ¡qué extraño!), así que para solucionarlo podemos usar la librería prototype y usarlo así:

setTimeout(
function(){ 
    this.otro_metodo(); 
}.bind(this), milisegundos);

No hay comentarios:

Publicar un comentario