A palavra-chave this em JavaScript pode ser confusa porque se comporta de maneira diferente em funções regulares e funções de seta. Nesta postagem do blog, explicaremos como isso funciona em ambos os tipos de funções, exploraremos por que essas diferenças existem e forneceremos o conhecimento básico necessário para entender isso em JavaScript.
Funções regulares em JavaScript são definidas usando a palavra-chave function. O valor disto nessas funções depende de como a função é chamada. Aqui estão vários exemplos:
function regularFunction() { console.log(this); } regularFunction(); // Logs the global object (window in browsers)
Explicação: No modo não estrito, quando uma função é chamada no contexto global (não como um método de um objeto), isso se refere ao objeto global (janela em navegadores ou global em Node .js).
'use strict'; function regularFunction() { console.log(this); } regularFunction(); // Logs undefined
Quando uma função é chamada como método de um objeto, this se refere a esse objeto.
const obj = { method: function() { console.log(this); } }; obj.method(); // Logs obj
Explicação: Neste caso, isso aponta para obj porque a função é chamada como um método de obj.
Quando uma função é usada como construtor (chamada com a palavra-chave new), isso se refere à instância recém-criada.
function Person(name) { this.name = name; this.sayHello = function() { console.log(`Hello, my name is ${this.name}`); }; } const person1 = new Person('Alice'); person1.sayHello(); // Logs "Hello, my name is Alice" const person2 = new Person('Bob'); person2.sayHello(); // Logs "Hello, my name is Bob"
Explicação: Quando chamado com new, isso dentro da função construtora Person se refere à nova instância que está sendo criada. Cada nova instância (person1 e person2) obtém sua própria propriedade name e método sayHello.
Você pode vincular isso explicitamente usando call, apply ou bind.
function regularFunction() { console.log(this); } const obj = { value: 42 }; regularFunction.call(obj); // Logs obj regularFunction.apply(obj); // Logs obj const boundFunction = regularFunction.bind(obj); boundFunction(); // Logs obj
Explicação: chame e aplique imediatamente invoca a função com this definido como obj, enquanto bind cria uma nova função com this permanentemente vinculado a obj.
As funções de seta, introduzidas no ES6, não possuem seu próprio contexto. Em vez disso, eles herdam isso do escopo (lexical) circundante. Isso torna as funções de seta úteis em determinadas situações.
As funções de seta herdam isso do escopo em que são definidas.
const arrowFunction = () => { console.log(this); }; arrowFunction(); // Logs the global object (window in browsers)
Explicação: As funções de seta não possuem isso próprio; eles usam isso do escopo circundante. Aqui, refere-se ao objeto global porque a função é definida no escopo global.
'use strict'; const arrowFunction = () => { console.log(this); }; arrowFunction(); // Logs undefined
Ao contrário das funções regulares, as funções de seta não recebem isso quando chamadas como métodos. Eles herdam isso do escopo anexo.
const obj = { method: () => { console.log(this); } }; obj.method(); // Logs the global object (window in browsers) or undefined in strict mode
Explicação: As funções de seta não vinculam seu próprio this, mas o herdam do escopo lexical. Neste exemplo, this refere-se ao objeto global ou indefinido no modo estrito, não ao obj.
Quando uma função de seta é definida dentro de outra função, ela herda isso da função externa.
function outerFunction() { const arrowFunction = () => { console.log(this); }; arrowFunction(); } const obj = { value: 42, outerFunction: outerFunction }; obj.outerFunction(); // Logs obj, because `this` in arrowFunction is inherited from outerFunction
Explicação: Neste caso, this dentro da função de seta refere-se ao mesmo this que em outerFunction, que é obj.
As funções de seta em manipuladores de eventos herdam isso do escopo léxico circundante, não do elemento que aciona o evento.
const button = document.querySelector('button'); button.addEventListener('click', () => { console.log(this); }); // Logs the global object (window in browsers) or undefined in strict mode
Explicação: A função de seta não vincula isso ao elemento de botão; ele o herda do escopo circundante, que é o escopo global ou indefinido no modo estrito.
A diferença entre funções regulares e funções de seta está em como elas lidam com isso:
Para entender o comportamento disso em JavaScript, você precisa conhecer os seguintes conceitos:
Compreender essas distinções ajudará você a escrever código JavaScript mais previsível e sustentável. Esteja você usando funções regulares ou funções de seta, saber como isso funciona é crucial para um desenvolvimento JavaScript eficaz.
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