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:
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.
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