"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 o contexto com `this` ao usar `setTimeout` em JavaScript?

Como preservar o contexto com `this` ao usar `setTimeout` em JavaScript?

Publicado em 2024-11-09
Navegar:429

How to Preserve Context with `this` When Using `setTimeout` in JavaScript?

Usando setTimeout e preservando o contexto com isso em JavaScript

Ao usar a função setTimeout em JavaScript, é essencial estar ciente de como ela lida o contexto disso. Isso se torna particularmente relevante ao chamar métodos definidos em um contexto diferente dentro do retorno de chamada de tempo limite.

No trecho de código fornecido, a função do método chama o método2, que recupera um elemento de imagem com base em um ID passado e define sua propriedade src . Inicialmente, o método2 é executado com sucesso. No entanto, após o atraso setTimeout, ocorre um erro porque a função method2 não está mais definida dentro do contexto pretendido.

O problema surge porque setTimeout cria um novo contexto de execução e a palavra-chave this é padronizada para o objeto global. No código fornecido, a função do método é invocada usando o contexto do protótipo de teste, mas quando o retorno de chamada de tempo limite é executado, o contexto this mudou para o objeto global.

Solução:

Para preservar o contexto pretendido dentro do retorno de chamada de tempo limite, você pode usar o método .bind() para definir explicitamente a ligação do contexto. Ao anexar .bind(this) ao final da função que está sendo passada para setTimeout, você pode garantir que this dentro da função de retorno de chamada se refira ao contexto pretendido.

No trecho de código atualizado:

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
};

Ao adicionar .bind(this), a palavra-chave this dentro da função de retorno de chamada será vinculada ao protótipo de teste, permitindo que o método2 seja chamado corretamente dentro do contexto do método do protótipo, mesmo após o atraso setTimeout.

Declaração de lançamento Este artigo foi reimpresso em: 1729735296 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