Entendiendo This En Javascript
- Javascript
            This es una keyword de javascript y tiene un comportamiento diferente en comparación con otros lenguajes de programación, este artículo te ayudará a entenderlo y como utilizarlo.
La clave para entender el comportamiento de this es identificando el contexto donde se utiliza, de acuerdo a esto su valor será definido.
Contexto global
Si this se ejecuta en un contexto global, este hará referencia al objeto window por defecto, por ejemplo.
console.log(this === window); // imprime true
var nombre = 'carlos'
console.log(window.nombre); // imprime carlos 
console.log(this.nombre); // imprime carlos
Contexto de función
En un contexto de función el valor de this hará referencia al objeto que la contiene, si continuamos el código anterior.
function imprimir_nombre() {
	console.log(this.nombre); // una función de ámbito global sigue referenciando al objeto global window
}
imprimir_nombre() // imprime carlos
window.imprimir_nombre() // imprime carlosEsto puede cambiar en modo estricto, en este modo es obligatorio llamar a la función como propiedad de un objeto sino this será undefined, si repetimos el código anterior el resultado es diferente.
'use strict'
function imprimir_nombre() {
	console.log(this.nombre); // una función de ámbito global sigue referenciando al objeto global window
}
imprimir_nombre() // Error!! imprime undefined
window.imprimir_nombre() // imprime carlos
La función imprimir_nombre puede asignarse a cualquier objeto, de esta manera cambiamos el contexto y this hará referencia al nuevo objeto contenedor, por ejemplo. 
var persona = {nombre : 'maría'}; // creando un objeto que contiene la propiedad nombre
persona.imprimir_nombre = imprimir_nombre; // asignando la función al objeto persona
persona.imprimir_nombre(); // imprime maría, this hace referencia a la propiedad del nuevo objeto
// Es lo mismo qué!!
var persona = {
	nombre : 'maria',
	imprimir_nombre : function(){
		console.log(this.nombre)
	}
}
Para cambiar de un contexto a otro también se puede usar call() y apply(), ambos métodos vincula this con el objeto pasado como primer parámetro.
var persona_2 = { nombre: 'josé' }
var persona_3 = { nombre: 'camila' }
imprimir_nombre.call(persona_2) // imprime josé
imprimir_nombre.apply(persona_3) // imprime camilaDesde ES5 está disponible también el método bind() a diferencia que las dos anteriores este retorna una nueva función con el mismo cuerpo y ámbito que la función original, donde this está fuertemente vinculado al objeto pasado como primer parámetro.
var persona_4 = { nombre: 'luis' }
imprimir_nombre.bind(persona_4)() // imprime luisContexto de clase
En este contexto this hará referencia al objeto que se esté creando con el keyword new, por ejemplo
class Persona{
	
	constructor(nombre,edad){
		this.nombre = nombre
		this.edad = edad
	}
	imprimir_nombre(){
		console.log(`${this.nombre} tiene ${this.edad} años de edad`)
	}
}
var p = new Persona('josé',25) //Creando el objeto
p.imprimir_nombre() //imprime josé tiene 25 años de edad
Contexto del DOM
Otro caso común donde usamos this es cuando manipulamos el DOM a través de una función como controlador de eventos, en estos casos this hará referencia al elemento que está disparando dicho evento, por ejemplo.
function color(e) {
	console.log(this === e.currentTarget);
	console.log(this === e.target);
	this.style.backgroundColor = '#A5D9F3';
}
var elements = document.getElementsByTagName('*');
for (var i = 0; i < elements.length; i++) {
	elements[i].addEventListener('click', color, false);
}Explicado esto, espero tengas una mejor noción de cómo funciona this, si tienes dudas escríbeme en los comentarios.