Entendiendo This En Javascript

- Javascript Entendiendo This En 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 carlos

Esto 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 camila

Desde 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 luis

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