A autora do material, cuja tradução publicamos hoje, diz que, quando trabalhava em contabilidade, eram usados termos claros, cujos significados são fáceis de encontrar no dicionário. Mas, depois de adotar a programação e, em particular, o JavaScript, ela começou a se deparar com conceitos cujas definições não podem mais ser encontradas em dicionários. Por exemplo, isso diz respeito à palavra 
this chave 
this . Ela lembra o momento em que se encontrou com objetos JS e funções de construtor que usavam essa palavra-chave, mas não foi tão fácil chegar ao seu significado exato. Ela acredita que outros iniciantes enfrentam problemas semelhantes, especialmente aqueles que nunca trabalharam em programação antes. Quem quiser aprender JavaScript terá que lidar com 
this qualquer maneira. Este material tem como objetivo ajudar todos a ajudar com isso.

O que é isso?
Trago a sua atenção minha própria definição da 
this . 
This é uma palavra-chave usada no JavaScript que possui um significado especial, dependendo do contexto em que é usada.
A razão pela qual 
this causa tanta confusão para iniciantes é porque o contexto 
this muda dependendo do seu uso.
This pode ser considerado uma palavra-chave dinâmica. Eu gosto de como o conceito de "contexto" é revelado 
neste artigo por Ryan Morr. Segundo ele, o contexto é sempre o valor da 
this , que se refere a um objeto que "possui" o código que está em execução no momento. No entanto, o contexto relacionado a 
this não é o mesmo que o contexto de execução.
Portanto, quando usamos a palavra 
this chave 
this , de fato, nos referimos a algum objeto com sua ajuda. Vamos falar sobre o que é esse objeto, tendo examinado alguns exemplos.
Situações em que isso aponta para um objeto de janela
Se você tentar acessar a 
this no escopo global, ela será vinculada ao contexto global, ou seja, ao objeto de 
window no navegador.
Ao usar funções que estão disponíveis no contexto global (isso as distingue dos métodos de objeto), a 
this nelas apontará para o objeto de 
window .
Tente executar este código, por exemplo, no console do navegador:
 console.log(this); //     Window // Window { postMessage: ƒ, // blur: ƒ, // focus: ƒ, // close: ƒ, // frames: Window, …} function myFunction() { console.log(this); } //   myFunction(); //      Window! // Window { postMessage: ƒ, // blur: ƒ, // focus: ƒ, // close: ƒ, // frames: Window, …} 
Usando isso dentro de um objeto
Quando 
this usado dentro de um objeto, essa palavra-chave se refere ao próprio objeto. Considere um exemplo. Suponha que você criou um objeto 
dog com métodos e chamou isso em um de seus métodos. Quando 
this usado dentro deste método, essa palavra-chave representa o objeto 
dog .
 var dog = { name: 'Chester', breed: 'beagle', intro: function(){   console.log(this); } }; dog.intro(); //      dog       // {name: "Chester", breed: "beagle", intro: ƒ} //    breed:"beagle" //    intro:ƒ () //    name:"Chester" //    __proto__:Object 
Este e objetos aninhados
A aplicação 
this em objetos aninhados pode criar alguma confusão. Em tais situações, vale lembrar que a palavra-chave this se refere ao objeto em cujo método é usado. Considere um exemplo.
 var obj1 = { hello: function() {   console.log('Hello world');   return this; }, obj2: {     breed: 'dog',     speak: function(){           console.log('woof!');           return this;       }   } }; console.log(obj1); console.log(obj1.hello());  //  'Hello world'   obj1 console.log(obj1.obj2); console.log(obj1.obj2.speak());  //  'woof!'   obj2 
Possui funções de seta
As funções de seta se comportam de maneira diferente das funções regulares. Lembre-se: ao acessar 
this no método de um objeto, essa palavra-chave corresponde ao objeto ao qual o método pertence. No entanto, isso não se aplica às funções de seta. Em vez disso, 
this em tais funções refere-se ao contexto global (o objeto de 
window ). Considere o seguinte código que pode ser executado no console do navegador.
 var objReg = { hello: function() {   return this; } }; var objArrow = {   hello: () => this }; objReg.hello();  
Se, intrigado com o problema em questão, observe o 
MDN , você poderá encontrar informações de que as funções de seta têm uma forma mais curta de escrita do que expressões funcionais e não estão vinculadas a suas próprias entidades, 
arguments , 
super ou 
new.target . As funções de seta são mais adequadas para uso como funções comuns, em vez de métodos de objeto; elas não podem ser usadas como construtores.
Ouviremos o MDN e não usaremos funções de seta como métodos de objeto.
Usando isso em funções regulares
Quando uma função regular está no escopo global, a palavra-chave this usada nela será vinculada ao objeto 
window . A seguir, é apresentado um exemplo no qual a função de 
test pode ser vista como um método do objeto de 
window .
 function test() { console.log('hello world'); console.log(this); } test();  
No entanto, se a função for executada no modo estrito, serão 
undefined os caracteres 
undefined , pois nesse modo as ligações padrão serão desativadas. Tente executar o exemplo a seguir no console do navegador.
 function test() { 'use strict'; return this; } console.log( test() );  
Chamando isso de uma função que foi declarada fora do objeto e depois atribuída como método
Considere o exemplo do objeto 
dog que já conhecemos. Como método deste objeto, você pode atribuir a função 
chase declarada fora dele. Não havia métodos no objeto 
dog , até 
foo método 
foo , ao qual a função 
chase foi atribuída. Se você agora chamar o método 
dog.foo , a função 
chase será chamada. A palavra 
this chave 
this , que é acessada nesta função, aponta para o objeto 
dog . E a função 
chase , ao tentar chamá-la como uma função independente, se comportará incorretamente, pois com essa abordagem, 
this apontará para um objeto global que não possui as propriedades que nós, nessa função, acessamos por meio 
this .
 var dog = { breed: 'Beagles', lovesToChase: 'rabbits' }; function chase() { console.log(this.breed + ' loves chasing ' + this.lovesToChase + '.'); } dog.foo = chase; dog.foo();  
Palavra-chave nova e isso
A palavra 
this chave usada nas funções construtoras para criar objetos, pois permite, de maneira universal, trabalhar com muitos objetos criados usando essa função. JavaScript também possui funções construtoras padrão com as quais, por exemplo, você pode criar objetos do tipo 
Number ou 
String . Funções semelhantes, determinadas pelo programador por conta própria, permitem criar objetos cuja composição de propriedades e métodos é definida por eles mesmos.
Como você já entendeu, eu gosto de cães, portanto descreveremos uma função construtora para criar objetos como 
Dog que contêm algumas propriedades e métodos.
 function Dog(breed, name, friends){   this.breed = breed;   this.name = name;   this.friends = friends;   this.intro = function() {       console.log(`Hi, my name is ${this.name} and I'm a ${this.breed}`);       return this;   }; } 
Quando uma função construtora é chamada usando a 
new palavra-chave, ela aponta para um novo objeto que, usando o construtor, é fornecido com propriedades e métodos.
Veja como trabalhar com construtores JavaScript padrão.
 var str = new String('Hello world');  var str2 = 'Hello world';  
Agora vamos trabalhar com a recém-criada função construtora 
Dog .
 //      Dog var chester = new Dog('beagle', 'Chester', ['Gracie', 'Josey', 'Barkley']); chester.intro();        //  Hi, my name is Chester and I'm a beagle console.log(chester);   //  Dog {breed: "beagle", name: "Chester", friends: Array(3), intro: ƒ} 
Aqui está outro exemplo de uso de funções construtoras.
 var City = function(city, state) { this.city = city || "Phoenix"; this.state = state || "AZ"; this.sentence = function() {   console.log(`I live in ${this.city}, ${this.state}.`); }; }; var phoenix = new City();  
Sobre a importância da nova palavra-chave
Ao chamar a função construtora usando a 
new palavra-chave, a 
this aponta para um novo objeto que, depois de algum trabalho, será retornado dessa função. A palavra 
this chave 
this situação é muito importante. Porque O fato é que, com sua ajuda, é possível, usando uma única função construtora, criar muitos objetos do mesmo tipo.
Isso nos permite dimensionar o aplicativo e reduzir a duplicação de código. Para entender a importância desse mecanismo, pense em como as contas de mídia social são organizadas. Cada conta pode ser uma instância de um objeto criado usando a função de construtor 
Friend . Cada um desses objetos pode ser preenchido com informações exclusivas do usuário. Considere o seguinte código.
 // - var Friend = function(name, password, interests, job){ this.fullName = name; this.password = password; this.interests = interests; this.job = job; }; function sayHello(){  //   ,  ,    this  // console.log(this); return `Hi, my name is ${this.fullName} and I'm a ${this.job}. Let's be friends!`; } //          Friend,    new var john = new Friend('John Smith', 'badpassword', ['hiking', 'biking', 'skiing'], 'teacher'); console.log(john); //    greeting  john john.greeting = sayHello; //     console.log( john.greeting() ); //   ,  sayHello()       console.log( sayHello() ) ; 
Sumário
De fato, o uso da 
this no JavaScript não se limita aos exemplos descritos acima. Portanto, uma série desses exemplos pode incluir o uso das funções de 
call , 
apply e 
bind . Como este material é destinado a iniciantes e tem o objetivo de explicar o básico, não abordamos aqui. No entanto, se você já formou um entendimento inicial 
this , poderá descobrir facilmente esses métodos. O principal é lembrar que, se você não consegue entender algo da primeira vez, não pare de aprender, praticar, ler materiais sobre o tópico em que está interessado. Em um deles, você certamente encontrará algo (algum tipo de frase bem-sucedida, por exemplo) que ajudará a entender o que você não conseguia entender antes.
Caros leitores! Você teve dificuldade para entender a palavra-chave this em JavaScript?