setTimeout e o elusivo "this" em JavaScript
Ao usar a função setTimeout, os desenvolvedores geralmente encontram um problema em que as chamadas subsequentes aos métodos perdem contexto pretendido, resultando em métodos aparentemente indefinidos. Isso normalmente é causado pela perda da referência "this".
O problema:
Considere o seguinte código:
test.prototype.method = function() { //method2 returns image based on the id passed this.method2('useSomeElement').src = "http://www.some.url"; timeDelay = window.setTimeout(this.method, 5000); }; test.prototype.method2 = function(name) { for (var i = 0; i 1) { return document.images[i]; } } };
No carregamento inicial da página, a função method2 funciona conforme o esperado. No entanto, depois de definir o tempo limite, as chamadas subsequentes ao método2 resultam em um erro indicando que ele é indefinido.
A solução:
O problema principal está na maneira como setTimeout lida a palavra-chave esta. Ao definir um tempo limite usando setTimeout(this.method, 5000), o contexto é perdido, resultando no erro.
Uma solução inteligente para esse problema é usar o método bind(). Ao anexar ".bind(this)" ao final da chamada do método, o contexto pode ser explicitamente vinculado, garantindo que a referência "this" correta seja mantida mesmo após o tempo limite.
Código aprimorado :
test.prototype.method = function() { //method2 returns image based on the id passed this.method2('useSomeElement').src = "http://www.some.url"; timeDelay = window.setTimeout(this.method.bind(this), 5000); // ^^^^^^^^^^^ <- fix context };
Com esta modificação, o contexto de "this" é devidamente vinculado, permitindo que o método2 continue funcionando conforme planejado após o tempo limite expirar. Essa abordagem é elegante e eficaz na preservação do contexto de execução correto.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3