"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como preservar a referência “this” ao usar setTimeout em JavaScript?

Como preservar a referência “this” ao usar setTimeout em JavaScript?

Publicado em 2024-12-22
Navegar:640

How to Preserve the \

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.

Declaração de lançamento Este artigo foi reimpresso em: 1729735477 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

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