"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 > Ponteiro Javascript “this” em funções aninhadas: como resolver a confusão?

Ponteiro Javascript “this” em funções aninhadas: como resolver a confusão?

Publicado em 2024-11-12
Navegar:109

Javascript \

Ponteiro Javascript "this" no enigma da função aninhada

Em um cenário de desenvolvimento web, o comportamento do ponteiro "this" dentro de funções aninhadas pode ser intrigante. Considere o seguinte código:

var std_obj = {
  options: {rows: 0, cols: 0},
  activeEffect: "none",
  displayMe: function() {
    // this refers to std_obj
    if (this.activeEffect == "fade") {}

    var doSomeEffects = function() {
      // this surprisingly refers to window object
      if (this.activeEffect == "fade") {}
    }

    doSomeEffects();
  }
};

std_obj.displayMe();

No código acima, o ponteiro "this" dentro da função aninhada "doSomeEffects()" aponta inesperadamente para o objeto "janela". Esse comportamento contradiz a expectativa de que a função aninhada herdaria o escopo da função externa, onde "this" se refere ao "std_obj".

Compreendendo o escopo e a invocação da função Javascript

O comportamento de "this" em funções Javascript depende de como a função é invocada. Geralmente, existem três maneiras:

  1. Invocação de método: someThing.someFunction(arg1, arg2, argN)
  2. Invocação de Function.call: someFunction.call(someThing, arg1, arg2, argN)
  3. Function.apply Invocação: someFunction.apply(someThing, [arg1, arg2, argN])

Em todas essas invocações, o objeto "this" será "someThing". No entanto, invocar uma função sem um objeto pai inicial (por exemplo, doSomeEffects() no exemplo) geralmente resultará no objeto "este" sendo definido como o objeto global, que na maioria dos navegadores é o objeto "janela".

No código de exemplo, a função aninhada "doSomeEffects()" é invocada sem um objeto pai, portanto ela herda o escopo global e seu ponteiro "this" aponta para o objeto "window". É por isso que você observa o comportamento inesperado.

Para garantir que a função aninhada tenha acesso ao escopo "std_obj", você pode invocá-la usando o método Function.call() com o objeto "std_obj" como o primeiro argumento:

var doSomeEffects = function() {
  // this now refers to std_obj
  if (this.activeEffect == "fade") {}
}

doSomeEffects.call(std_obj);

Compreender as nuances sutis do comportamento do ponteiro "este" em Javascript é crucial para construir aplicativos robustos e de fácil manutenção.

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