~/ 👨‍💻 uncodigo.com _


Guía definitiva para entender 'this' en JavaScript

Por Felipe el
Descubre cómo funciona el contexto 'this' en JavaScript, con ejemplos prácticos y explicaciones claras para dominar este concepto fundamental.

Uno de los conceptos más desafiantes en JavaScript para desarrolladores principiantes y avanzados es el contexto de ejecución, representado por la palabra clave this. Comprender cómo funciona el this puede marcar la diferencia entre un código funcional y uno lleno de errores difíciles de rastrear.

Este artículo te llevará paso a paso a través de los fundamentos y las aplicaciones avanzadas de this en JavaScript, con ejemplos claros y explicaciones detalladas.

¿Qué es el this en JavaScript?

En JavaScript, this es una palabra clave que se refiere al contexto de ejecución actual, o más específicamente, al objeto al que pertenece la función que se está ejecutando. Sin embargo, su valor depende de cómo y dónde se llame la función, lo que puede hacer que su comportamiento sea confuso.

En términos generales, el valor de this es determinado en el momento en que se invoca una función, no en el momento en que se define.

Reglas Fundamentales para Determinar el Valor de this

1. En el Ámbito Global

En el navegador, cuando this se utiliza fuera de cualquier función, se refiere al objeto global window.

console.log(this); // window en el navegador

En Node.js, el valor de this en el ámbito global es un objeto vacío ({}).

console.log(this); // {}

2. Dentro de una Función Regular

Cuando se llama a una función regular, el valor de this es el objeto global en modo no estricto (window en el navegador). En modo estricto, this es undefined.

Ejemplo en Modo No Estricto:

function showThis() {
  console.log(this);
}
showThis(); // window (en navegadores)

Ejemplo en Modo Estricto:

'use strict';
function showThis() {
  console.log(this);
}
showThis(); // undefined

3. Dentro de un Objeto (Métodos)

Cuando una función es invocada como método de un objeto, el valor de this es ese objeto.

const obj = {
  name: 'Objeto',
  showThis() {
    console.log(this);
  }
};
obj.showThis(); // { name: 'Objeto', showThis: [Function: showThis] }

4. En Constructores y Clases

Cuando usamos una función constructora o una clase, this se refiere al nuevo objeto que se crea.

Ejemplo con una Función Constructora:

function Person(name) {
  this.name = name;
}
const person = new Person('Juan');
console.log(person.name); // 'Juan'

Ejemplo con una Clase:

class Animal {
  constructor(species) {
    this.species = species;
  }
}
const dog = new Animal('Canino');
console.log(dog.species); // 'Canino'

Cambiando el Contexto de this

Existen métodos para modificar manualmente el valor de this en JavaScript: call, apply y bind.

Método call

call invoca una función y establece explícitamente el valor de this.

function greet() {
  console.log(`Hola, ${this.name}`);
}
const user = { name: 'Maria' };
greet.call(user); // 'Hola, Maria'

Método apply

Es similar a call, pero recibe los argumentos en forma de array.

greet.apply(user); // 'Hola, Maria'

Método bind

bind devuelve una nueva función con un valor fijo de this.

const boundGreet = greet.bind(user);
boundGreet(); // 'Hola, Maria'

this en Funciones Flecha

Las funciones flecha no tienen su propio contexto this. En su lugar, heredan el this del contexto donde se definieron.

const obj = {
  name: 'Objeto',
  showThis: () => {
    console.log(this);
  }
};
obj.showThis(); // window (en navegadores)

Problemas Comunes con this y Cómo Resolverlos

1. Pérdida del Contexto

Cuando pasamos un método como callback, el valor de this puede cambiar inesperadamente.

Ejemplo:

const obj = {
  name: 'Objeto',
  showThis() {
    console.log(this);
  }
};
setTimeout(obj.showThis, 1000); // window (en navegadores)

Solución con bind:

setTimeout(obj.showThis.bind(obj), 1000); // { name: 'Objeto', showThis: [Function: showThis] }

2. Uso en Eventos del DOM

En controladores de eventos, this se refiere al elemento que disparó el evento.

const button = document.querySelector('button');
button.addEventListener('click', function() {
  console.log(this); // El botón clickeado
});

Para usar el contexto exterior, utiliza una función flecha.

button.addEventListener('click', () => {
  console.log(this); // Contexto exterior
});

Dominando el Uso de this

El manejo correcto de this es clave para escribir código JavaScript eficiente y sin errores. Dedicar tiempo a practicar con diferentes escenarios y utilizar herramientas como bind, call y funciones flecha puede facilitar el trabajo.

Si tienes preguntas o quieres compartir tus propios consejos sobre this, ¡no dudes en dejar un comentario!