E frequente a necessidade do programador javascript escrever funcoes ou rotinas utilizando um contador para executar determinada acao em um intervalo de tempo, principalmente em ambientes utilizando ajax onde voce necessita executar uma funcao em determinado espaco de tempo.setInterval e setTimeoutA funcao setTimeout do javascript difere-se da setInterval por um detalhe: setInterval executa a funcao passada por parametro infinitamente em intervalos de milisegundos passados como segundo parametro a funcao. Ex: setInterval('funcao()', 1000).Obs: 1000 milisegundos equivalem a 1 segundo.A funcao setTimeout executa a funcao passada por parametro apenas uma vez, depois de passados a espera, tambem em milisegundos, ao segundo parametro da funcao. Ex: setTimeout('funcao()', 1000)Como passar metodos por parametroE possivel programar em javascript orientado a objetos. Nesse post nao vou entrar nos detalhes de orientacao a objetos. Mas se voce desejar passar um metodo por parametro dentro de seu objetos para uma das funcoes acima?Primeiro, ha outra forma de passar a funcao por parametro: (Iremos referenciar sempre setInterval, mas tudo que se aplica a essa, se aplica a setTimeout. A diferenca entre as duas esta no topico anterior)setInterval(funcao, 1000). Ou seja, passa uma funcao apenas pelo nome, nesse caso e passado a referencia da funcao.Dado a seguinte classe:<script type="text/javascript">function Classe() { var intervalo = 1; // Intervalo em segundos this.metodo = function() { alert("Estou dentro de um setInterval!"); } // Aqui vai o metodo que chama o setInterval e passa o this.metodo como parametro this.set = function() { setInterval(this.metodo, intervalo*1000); // Transforma segundos em milisegundos multiplicando por 1000 }}var c = new Classe();c.set();</script>Esse codigo funciona?Funciona!MASSe quisessemos chamar um outro metodo dentro do Classe.metodo e ainda passar parametros para o metodo passado na funcao, NAO FUNCIONA!Mudando a classe anterior:<script type="text/javascript">function Classe() { var intervalo = 1; // Intervalo em segundos this.metodo = function(msg) { this.metodo2(msg); // Chamando um outro metodo para exibir o alert } this.metodo2 = function(msg) { alert(msg); } // Aqui vai o metodo que chama o setInterval e passa o this.metodo como parametro this.set = function(msg) { setInterval(this.metodo(msg), intervalo*1000); // Transforma segundos em milisegundos multiplicando por 1000 }}var c = new Classe();c.set('Estou dentro de um setInterval');</script>Primeiro, esse codigo gerara um erro, voce nao esta passando uma referencia da funcao para setInterval e sim o valor resultante da funcao, nesse caso undefined. Esse problema e facil de resolver:setInterval(function() {this.metodo(msg);}, intervalo*1000);Otimo, agora estou passando a referencia de uma funcao que executa o metodo em seu corpo. Mas ainda causara um erro. A funcao this.metodo2() nao esta definida!Isso acontece porque o this.metodo esta sendo chamado repetidamente dentro do contexto do objeto window, ao qual pertence a funcao setInterval e setTimeout (window.setInterval, window.setTimeout) e nao dentro do contexto do objeto. Dessa forma, os metodos chamados dentro do metodo passado por parametro estarao dentro do contexto de window.A SOLUCAODevemos passar uma copia do objeto para a funcao chamada em setInterval ou setTimeout dessa forma:<script type="text/javascript">function Classe() { var self = this; // Essa e a copia do objeto var intervalo = 1; // Intervalo em segundos this.metodo = function(msg) { this.metodo2(msg); } this.metodo2 = function(msg) { alert(msg); } // Aqui vai o metodo que chama