This en JavaScript: ¿Qué es y que hace? Con ejemplos!
En JavaScript, el uso de this es esencial para entender cómo funcionan los objetos y el contexto en el que se ejecuta el código. ¿Qué significa this? Es una referencia que apunta al objeto que está ejecutando el código actual. ¿Para qué sirve y qué hace? Permite acceder a propiedades y métodos del objeto en diferentes contextos. Descubre cómo funciona, cómo usarlo correctamente y aprende con un ejemplo práctico que hará todo más claro.

Índice
1. ¿Qué significa this en JavaScript?
En JavaScript, this es una palabra clave que representa una referencia especial. Su propósito principal es proveer acceso al «contexto de ejecución actual» de una función o bloque de código. Dependiendo del lugar donde se utilice, this puede referirse a diferentes objetos, y su valor se determina en el momento de la ejecución.
En resumen:this actúa como un «puntero» dinámico que cambia según cómo y dónde se llama una función.
1.1. ¿Qué es el contexto de ejecución en JavaScript?
El contexto de ejecución es el entorno en el que se evalúa y ejecuta el código en JavaScript. Este entorno incluye toda la información necesaria para que el código funcione correctamente, como variables, funciones y el valor de this.
En términos simples:
El contexto de ejecución es el «lugar lógico» o «entorno» que define qué recursos y datos están disponibles para el código en un momento dado y cómo puede acceder a ellos.
Cada contexto de ejecución tiene tres componentes principales:
- Objeto global (
Global Object)
Es el entorno base donde se ejecuta todo el código en JavaScript. En navegadores, el objeto global eswindow. En Node.js, esglobal. - Ámbito (
Scope)
El conjunto de variables, funciones y objetos accesibles desde el código en un momento dado. - Referencia a
this
El valor dethisen el contexto actual. Cambia dependiendo de cómo y dónde se ejecuta el código.
RECUERDA!! El valor de this en JavaScript siempre está vinculado al contexto de ejecución actual. Por eso, entender cómo y dónde se crea el contexto es clave para manejar this.
2. Ejemplo básico de uso de this en JavaScript.
Supongamos que tenemos un objetos con sus propiedades y el uso de this:
const person = {
name: "Juan",
age: 30,
greet() {
console.log(`Hola, mi nombre es ${this.name} y tengo ${this.age} años.`);
},
};
person.greet(); // Llamada al método
// Resultado: Hola, mi nombre es Juan y tengo 30 años.Lenguaje del código: JavaScript (javascript)
Explicación paso a paso:
- Definición del objeto
person:- El objeto
persontiene tres propiedades:name: Una cadena con el valor"Juan".age: Un número con el valor30.greet: Una función (método) que usathis.
- El objeto
- Uso de
thisen el métodogreet:- Dentro del método
greet, usamosthispara acceder a las propiedades del objeto. this.name: Hace referencia a la propiedadnamedel objeto actual (person).this.age: Hace referencia a la propiedadagedel objeto actual (person).
- Dentro del método
- Llamada al método
greet:person.greet();- Cuando llamamos al método
greeta través deperson, el valor dethisdentro del método se refiere al objeto que lo invoca, en este caso,person.
- Cuando llamamos al método
- Resultado:
- El método imprime:
Hola, mi nombre es Juan y tengo 30 años.
- El método imprime:
NOTA!!!! Si te animas y deseas ver el resultado de este ejemplo y de todos los que iremos proporcionando directamente desde tu PC, te invito a seguir estos pasos.
- Primero, revisa el punto 5 del siguiente artículo sobre como usar e instalar VSCode (este es el editor de código mas usado), donde encontrarás los pasos para crear la estructura necesaria para visualizar una página desde tu navegador predeterminado.
- Si entendiste correctamente este paso anterior, sabrás donde colocar el código
scriptque te acabamos de proporcionar. Ahora, puedes visualizar el resultado, para ello puedes hacer lo siguiente:- Una vez abierta y visualizada la página, abre la consola del navegador presionando la tecla F12.
- Ahora, dirígete a la pestaña que dice
Console, y desde aquí podrás ver el resultado del script que hayamos introducido anteriormente.
- No te preocupes, estos pasos son más simples de lo que parecen!!!! Entonces… cada vez que dejemos un código de ejemplo como éste, puedes seguir estos pasos y ver los resultados por ti mismo. ¡Ojalá te animes!!!!
¿Por Qué Funciona Así?
En JavaScript, cuando un método es invocado usando la notación de punto (objeto.metodo()), el valor de this dentro del método apunta al objeto que precede al punto, es decir, el objeto que invoca el método.
CONCLUSIÓN:
thisdepende del objeto que invoca el método.- Si la función no es invocada dentro de un objeto,
thisapunta al contexto global (o esundefineden modo estricto).
3. ¿Para que sirve this en JavaScript?.
Como dijimos, this nos permite acceder y manipular propiedades y métodos del contexto de ejecución en el que se utiliza. El valor de this varía dependiendo del contexto en el que se emplee, y nos proporciona una forma flexible de referirnos al objeto o entidad que está ejecutando el código.
A continuación, detallamos en qué contextos se puede usar this y a qué propiedades puede acceder:
3.1. this en el contexto global
3.1.1. ¿Qué es el contexto global?
El contexto global se refiere al entorno de ejecución más externo en el que se ejecuta tu código JavaScript.
- En los navegadores este entorno suele ser el objeto
windowy es accesible desde cualquier parte del código (excepto dentro de bloques cerrados, como funciones o módulos, sin un enlace explícito), y proporciona muchas propiedades y métodos útiles para interactuar con el navegador. - En Node.js, el contexto global está representado por el objeto
global, aunque en los módulos individuales,thisno apunta aglobal, sino a un objeto vacío ({}).
Relación entre this y el objeto global:
Esto significa que cualquier variable o función definida en el contexto global con var será accesible a través de this (aunque esto no aplica a variables declaradas con let o const).
3.1.2. Propiedades que this puede acceder del objeto global
En el navegador, usando this, se puede acceder a:
var globalVariable = "Hola, Mundo";
console.log(this.globalVariable); // "Hola, Mundo"Lenguaje del código: JavaScript (javascript)
- Funciones globales:
function saludar() {
console.log("¡Hola!");
}
this.saludar(); // Llama a la función global `saludar`Lenguaje del código: JavaScript (javascript)
- Métodos del objeto
window(APIs Del Navegador):
this.alert("Esto es una alerta"); // Muestra una alertaLenguaje del código: JavaScript (javascript)
En Node.js:
- No es posible acceder directamente a las propiedades del objeto
globalusandothisfuera de un módulo.
3.1.3. Ejemplo en un navegador
// Definiendo variables y funciones en el contexto global
var nombre = "JavaScript";
function mostrarNombre() {
console.log("Este es el lenguaje:", this.nombre);
}
// Accediendo al contexto global con this
console.log(this.nombre); // "JavaScript"
this.mostrarNombre(); // "Este es el lenguaje: JavaScript"
// Usando una función de `window` (objeto global)
this.alert("¡Esto viene del objeto global window!");Lenguaje del código: JavaScript (javascript)
Explicación Del Ejemplo:
- Variable global
nombre:- Se añade automáticamente al objeto global
windowporque está declarada convar. Por lo tanto, es accesible mediantethis.nombre.
- Se añade automáticamente al objeto global
- Función global
mostrarNombre:- Como está definida globalmente, se convierte en un método del objeto
window. Por lo tanto, se puede llamar conthis.mostrarNombre().
- Como está definida globalmente, se convierte en un método del objeto
- Método
alert:- Este es un método integrado del objeto
window. Acceder a él usandothis.alertes equivalente a llamarlo directamente.
- Este es un método integrado del objeto
3.1.4. Ejemplo en Node.js
// Fuera de un módulo
console.log(this); // {}
// Definiendo una variable global
var lenguaje = "JavaScript";
global.version = "ES2023";
// Accediendo a propiedades del objeto global
console.log(global.lenguaje); // undefined (las variables globales no se asocian automáticamente a `global`)
console.log(global.version); // "ES2023"Lenguaje del código: JavaScript (javascript)
Explicación:
thisen Node.js:- Fuera de un módulo, es un objeto vacío (
{}).
- Fuera de un módulo, es un objeto vacío (
- Objeto
global:- Variables declaradas con
varno se asocian automáticamente al objetoglobal. - Propiedades asignadas directamente al objeto
globalson accesibles.
- Variables declaradas con
Conclusión:
- Dominar estas diferencias es crucial para evitar errores en entornos mixtos.
- En el contexto global del navegador,
thises una referencia directa al objetowindow, permitiendo acceder a variables, funciones y APIs globales. - En Node.js, el contexto global usa el objeto
global, perothisno apunta a él, promoviendo la encapsulación de módulos.
3.2. Uso de this en el contexto de funciones regulares
3.2.1. ¿Qué significa el uso de this en funciones regulares?
En JavaScript, funciones regulares (o «normales») son aquellas definidas con la palabra clave function. El valor de this dentro de estas funciones depende de cómo se invoca la función.
- Sin
use strict:- Si la función se llama directamente (como una función independiente),
thisapunta al objeto global (windowen navegadores,globalen Node.js).
- Si la función se llama directamente (como una función independiente),
- Con
use strict:- En el modo estricto (
'use strict'),thisdentro de una función regular no se enlaza automáticamente al objeto global. En su lugar, seráundefined, lo que evita errores y promueve un código más seguro.
- En el modo estricto (
- Cuando la función es un método:
- Si la función regular se invoca como un método de un objeto,
thisapunta al objeto que la contiene.
- Si la función regular se invoca como un método de un objeto,
¿Qué Es El Modo Estricto en JavaScript?
El modo estricto (o "use strict") es una característica de JavaScript introducida en ECMAScript 5 que permite ejecutar el código en un modo más seguro y restrictivo. Su propósito es ayudarte a evitar errores comunes y a escribir un código más limpio y predecible.
¿Cómo Activar El Modo Estricto?
Se activa añadiendo la línea "use strict"; al principio de un archivo o función. Por ejemplo:
Modo Estricto Local (Dentro De Una Función):
"use strict";
console.log("Modo estricto activado");Lenguaje del código: JavaScript (javascript)
Modo Estricto Global (Todo El Archivo):
function usarModoEstricto() {
"use strict";
console.log("Modo estricto activado solo aquí");
}Lenguaje del código: JavaScript (javascript)3.2.2. Ejemplo de this en una función global (sin modo estricto)
Cuando llamas una función normal en el contexto global (fuera de un objeto), this apunta al objeto global. En navegadores, este objeto es window.
Ejemplo:
function globalFunction() {
console.log(this);
}
globalFunction();
// Resultado: WindowLenguaje del código: JavaScript (javascript)
¿Por qué?
- En el contexto global (y sin modo estricto), el objeto global es el propietario implícito de la función.
3.2.3. Ejemplo de this en una función global (con modo estricto)
En modo estricto, this en una función normal no apunta al objeto global, sino que es undefined.
Ejemplo:
'use strict';
function strictFunction() {
console.log(this);
}
strictFunction();
// Resultado: undefinedLenguaje del código: JavaScript (javascript)
¿Por qué?
- El modo estricto elimina el enlace automático de
thisal objeto global para evitar errores y comportamientos inesperados.
3.2.4. Ejemplo de this en métodos de un objeto
Cuando una función normal es llamada como un método de un objeto, el valor de this apunta al objeto que la invoca (este caso es ampliado en punto 3.3.).
Ejemplo:
const persona = {
nombre: 'Manuel',
saludar: function () {
console.log(this.nombre);
}
};
persona.saludar();
// Resultado: 'Manuel'Lenguaje del código: JavaScript (javascript)
¿Por qué?
- En este caso, el objeto (
persona) es el receptor de la llamada. Por lo tanto,thisapunta al objeto que invoca el método.
3.2.5. Ejemplo de this en funciones normales dentro de métodos
Si defines una función normal dentro de un método, this en la función interna no hereda el valor de this del método externo. En su lugar, this apunta al objeto global (o undefined en modo estricto).
Ejemplo:
const persona = {
nombre: 'Manuel',
saludar: function () {
function funcionInterna() {
console.log(this);
}
funcionInterna();
}
};
persona.saludar();
// Resultado: Window (o undefined en modo estricto)Lenguaje del código: JavaScript (javascript)
¿Por qué?
- Las funciones normales no enlazan automáticamente
thisal contexto del objeto que las contiene.
3.3. Uso de this en el contexto de objetos:
Cuando una función es un método de un objeto (es decir, una función definida dentro de un objeto o asignada como propiedad de un objeto), el valor de this dentro de esa función apunta al objeto que la contiene.
3.3.1. ¿Qué significa esto?
- En el contexto de objetos,
thissirve para referirse al propio objeto al que pertenece el método, lo que permite acceder a sus propiedades o invocar otros métodos. - Esto es útil cuando necesitas manipular datos específicos del objeto sin importar cómo o dónde se invoque el método.
3.3.2. Ejemplo de this en el contexto de objetos:
const persona = {
nombre: "Juan",
saludar: function() {
console.log(`Hola, mi nombre es ${this.nombre}`);
}
};
// Llamamos al método 'saludar' del objeto 'persona'
persona.saludar(); // Hola, mi nombre es JuanLenguaje del código: JavaScript (javascript)
Explicación paso a paso:
- El Objeto:
personaes un objeto que tiene una propiedadnombrey un métodosaludar.
- El Método:
saludares una función definida dentro del objetopersona.
- El Valor de
this:- Dentro del método
saludar, el valor dethisapunta al objeto que contiene el método (persona). - Por lo tanto,
this.nombreaccede a la propiedadnombredel objetopersona.
- Dentro del método
- Resultado:
- Cuando llamamos
persona.saludar(), el método utilizathis.nombrepara acceder al valor"Juan"y genera el mensaje: «Hola, mi nombre es Juan».
- Cuando llamamos
3.4. Uso de this en el contexto de funciones flecha
Las funciones flecha tienen un comportamiento especial con respecto a this: no tienen su propio contexto de this. En lugar de crear un nuevo valor para this, heredan el valor de this del contexto donde fueron definidas. Este comportamiento se llama «binding léxico».
3.4.1. ¿Qué significa que no tienen su propio this?
- En funciones normales, el valor de
thisdepende de cómo se llama la función. - En funciones flecha, el valor de
thisdepende de dónde se define la función.
En otras palabras, las funciones flecha no cambian el valor de this según cómo se llamen. En su lugar, simplemente «heredan» el this del lugar donde están declaradas.
¿Por qué es esto útil?
Este comportamiento resuelve problemas comunes en JavaScript relacionados con el cambio dinámico de this, especialmente al trabajar con funciones anidadas o callbacks, donde el valor de this podría ser inesperado en funciones regulares.
3.4.2. Ejemplo de uso de this en el contexto de funciones flecha
const objeto = {
nombre: "María",
saludar: function () {
const funcionFlecha = () => {
console.log(`Hola, mi nombre es ${this.nombre}`);
};
funcionFlecha();
}
};
objeto.saludar(); // Hola, mi nombre es MaríaLenguaje del código: JavaScript (javascript)
Explicación paso a paso:
- El Objeto:
objetotiene una propiedadnombrey un métodosaludar.
- El método
saludar:- Dentro de
saludar, declaramos una función flecha llamadafuncionFlecha.
- Dentro de
- El valor de
this:- La función flecha no crea su propio
this. En lugar de eso, hereda el valor dethisdel métodosaludar. - Como
saludares un método del objetoobjeto, su valor dethisapunta aobjeto.
- La función flecha no crea su propio
- Resultado:
- Cuando se invoca
objeto.saludar(),this.nombredentro defuncionFlechaaccede a la propiedadnombredeobjeto, resultando en el mensaje: «Hola, mi nombre es María».
- Cuando se invoca
3.4.3. Comparación con funciones regulares
Si usáramos una función regular en lugar de una función flecha:
const objeto = {
nombre: "María",
saludar: function () {
function funcionRegular() {
console.log(`Hola, mi nombre es ${this.nombre}`);
}
funcionRegular();
}
};
objeto.saludar(); // Hola, mi nombre es undefined (en modo estricto)Lenguaje del código: JavaScript (javascript)
Explicación Del Comportamiento:
- Las funciones regulares crean su propio valor de
this, que apunta al objeto global (windowen navegadores oundefineden modo estricto), no al objetoobjeto. - Esto causa que
this.nombreseaundefined.
3.4.4. ¿Cuándo usar funciones flecha con this?
- Callbacks en métodos de objetos:
- Cuando necesitas preservar el valor de
thisde un método, una función flecha garantiza quethisno cambie.
- Cuando necesitas preservar el valor de
- Trabajando con
setTimeoutosetInterval:- Las funciones flecha evitan que
thiscambie al contexto global.
- Las funciones flecha evitan que
- Funciones anidadas:
- Cuando una función está dentro de otra, las funciones flecha pueden heredar el
thisdel contexto externo.
- Cuando una función está dentro de otra, las funciones flecha pueden heredar el
Conclusión:
El comportamiento único de this en funciones flecha las hace especialmente útiles para evitar confusiones relacionadas con el cambio dinámico de this. Al heredar el contexto léxico, simplifican el trabajo con objetos, callbacks y funciones anidadas, haciéndolas una herramienta poderosa en JavaScript moderno.
3.5. Uso de this en funciones constructores:
En el contexto de constructores, el valor de this se comporta de manera distinta en comparación con funciones normales o flechas. Este comportamiento está diseñado para que sea intuitivo y consistente al trabajar con objetos y programación orientada a objetos (POO).
3.5.1. ¿Qué es una función constructora?
Una función constructora es una función especial usada para crear y inicializar objetos. Cuando llamas a una función constructora con new, se crea un nuevo objeto vacío, y this en la función constructora apunta a ese nuevo objeto.
3.5.2. Cómo funciona this en una función constructora
- Creación de un nuevo objeto: Cuando llamas a una función con
new, se crea automáticamente un nuevo objeto vacío. - Asociación de
this:- Dentro de la función constructora,
thisapunta al nuevo objeto creado.
- Dentro de la función constructora,
- Propiedades y métodos: Puedes usar
thispara agregar propiedades y métodos al nuevo objeto. - Devolución implícita: Si no devuelves nada explícitamente, la función devuelve el nuevo objeto automáticamente.
3.5.3. Ejemplo con función constructora
function Animal(tipo, sonido) {
this.tipo = tipo; // Asigna 'tipo' a la nueva instancia
this.sonido = sonido; // Asigna 'sonido' a la nueva instancia
}
// Crear una instancia usando new
const perro = new Animal("Perro", "Guau");
console.log(perro.tipo); // Perro
console.log(perro.sonido); // GuauLenguaje del código: JavaScript (javascript)
Explicación paso a paso
- Definición de la Función Constructora:
- La función
Animalrecibe dos parámetros:tipoysonido. - Utiliza
thispara asignar estos valores como propiedades del objeto que se creará.
- La función
- Creación de Instancias:
- Al llamar
new Animal("Perro", "Guau"), JavaScript crea un nuevo objeto vacío. thisapunta a este nuevo objeto.tipoysonidose asignan como propiedades dethis.
- Al llamar
- Acceso a las Propiedades:
- La instancia
perroahora tiene las propiedadestipoysonidoespecíficas.
- La instancia
3.5.4. Características importantes de this en constructores
thisapunta a diferentes instancias:- Cada vez que se utiliza
new, se crea un nuevo objeto, ythisapunta a ese nuevo objeto.
- Cada vez que se utiliza
- Obligatorio con
new:- Si llamas a una función constructora sin
new,thisapuntará al contexto global (windowen navegadores) o seráundefineden modo estricto.
- Si llamas a una función constructora sin
Conclusión:
El uso de this en constructores es crucial para asignar propiedades y métodos a las nuevas instancias de objetos o clases. Este mecanismo permite crear objetos personalizados con propiedades únicas, lo que es esencial en el desarrollo de aplicaciones basadas en objetos.
3.6. Uso de this en el contexto de clases.
3.6.1. ¿Qué son las clases?
Las clases son una manera más estructurada y moderna de definir y crear objetos en JavaScript. Introducidas en ES6 (ECMAScript 2015), las clases permiten implementar el paradigma de Programación Orientada a Objetos (POO) de una forma más clara, aunque internamente siguen siendo una capa de «azúcar sintáctico» sobre las funciones constructoras.
3.6.2. ¿Qué significa usar this en clases?
Cuando usas this dentro de una clase, representa al objeto actual creado por la clase. Este comportamiento es similar al de las funciones constructoras, pero con las siguientes diferencias clave:
| Aspecto | Funciones Constructoras | Clases |
|---|---|---|
| Asignación de métodos | Debes asignarlos manualmente al prototipo. | Los métodos declarados dentro de la clase van al prototipo automáticamente. |
Obligación de usar new | this puede comportarse de forma inesperada sin new. | Obliga a usar new, de lo contrario lanza un error. |
| Modo Estricto | No lo requiere explícitamente. | Siempre está en modo estricto. |
| Legibilidad y claridad | Menos claro, especialmente para desarrolladores principiantes. | Más legible, con una sintaxis moderna y estructurada. |
3.6.3. Ejemplo de uso de this en clases:
class Persona {
constructor(nombre, edad) {
this.nombre = nombre; // Asigna el nombre a la instancia
this.edad = edad; // Asigna la edad a la instancia
}
saludar() {
console.log(`Hola, me llamo ${this.nombre} y tengo ${this.edad} años.`);
}
}
// Crear instancias de la clase
const persona1 = new Persona("Carlos", 30);
const persona2 = new Persona("Ana", 25);
// Llamar al método saludar en cada instancia
persona1.saludar(); // Hola, me llamo Carlos y tengo 30 años.
persona2.saludar(); // Hola, me llamo Ana y tengo 25 años.Lenguaje del código: JavaScript (javascript)
Explicación paso a paso:
- La clase
Persona:- Tiene un constructor que define dos propiedades (
nombreyedad) para la instancia. - Contiene un método
saludarque utilizathispara acceder a las propiedades de la instancia.
- Tiene un constructor que define dos propiedades (
- Creación de instancias:
- Se crean dos instancias (
persona1ypersona2) usando la palabra clavenew. - Cada instancia tiene su propio contexto de
this.
- Se crean dos instancias (
- Acceso a propiedades usando
this:- En
persona1.saludar(),thisapunta apersona1, por lo quethis.nombrees"Carlos"ythis.edades30. - En
persona2.saludar(),thisapunta apersona2, por lo quethis.nombrees"Ana"ythis.edades25.
- En
- Resultado:
- Cada instancia de la clase
Personatiene su propio contexto dethis, permitiendo que el métodosaludarfuncione de manera independiente para cada objeto.
- Cada instancia de la clase
3.7. Uso de this en Event Listeners
3.7.1. ¿Qué significa que this apunta al elemento DOM que disparó el evento?
En JavaScript, los event listeners son funciones asociadas a elementos del DOM que se ejecutan en respuesta a ciertos eventos, como un clic o un movimiento del mouse.
Cuando se usa this dentro de un event listener, hace referencia al elemento DOM específico que disparó el evento. Esto significa que puedes usar this para manipular directamente ese elemento, sin necesidad de seleccionarlo nuevamente con métodos como document.querySelector.
3.7.2. Ejemplo de uso de this en Event Listeners
//HTML con el botón
<button id="miBoton">Haz clic aquí</button>
//SCRIPT con el uso del this
<script>
// Seleccionar el botón
const boton = document.getElementById("miBoton");
// Agregar un event listener
boton.addEventListener("click", function () {
// Cambiar el texto del botón
this.textContent = "¡Hazme clic otra vez!";
// Cambiar el color del botón
this.style.backgroundColor = "yellow";
});
</script>Lenguaje del código: HTML, XML (xml)
Explicación paso a paso:
- Elemento seleccionado:
- Seleccionamos el botón con
document.getElementById("miBoton").
- Seleccionamos el botón con
- Event Listener asociado:
- Usamos el método
addEventListenerpara asociar un controlador de eventos al botón. En este caso, el evento es"click", que se dispara cuando el usuario hace clic en el botón.
- Usamos el método
- Uso de
this:- Dentro del event listener,
thisapunta al elemento que disparó el evento, es decir, el botón. - Cambiamos el texto del botón con
this.textContent = "¡Hazme clic otra vez!". - Cambiamos el color de fondo del botón con
this.style.backgroundColor = "yellow".
- Dentro del event listener,
- Resultado:
- Cuando el usuario hace clic en el botón, se ejecuta la función, y el texto y el color del botón cambian dinámicamente.
Conclusión:
this en event listeners es una herramienta poderosa para interactuar dinámicamente con elementos en una página web. Permite personalizar el comportamiento de cada elemento en respuesta a eventos, haciéndolo esencial en el desarrollo de interfaces interactivas.
3.8. Manipulación de this con los métodos call, apply y bind:
En JavaScript, el valor de this en una función puede ser manipulado manualmente utilizando los métodos call, apply y bind. Estos métodos son especialmente útiles cuando necesitas controlar o establecer el valor de this en diferentes contextos.
3.8.1. call
El método call permite invocar una función y explícitamente establecer el valor de this. Los argumentos para la función se pasan de forma individual.
Ejemplo con call
function greet(language) {
console.log(`Hola, soy ${this.name}. Hablo ${language}.`);
}
// Usando call para establecer el valor de this
greet.call({ name: "Ana" }, "español");
// Resultado: Hola, soy Ana. Hablo español.Lenguaje del código: JavaScript (javascript)
Explicación:
- Definición de la función:
greetes una función regular que utilizathispara acceder a la propiedadname.
- Uso de
call:- Usamos
callpara llamar agreety pasamos un objeto{ name: "Ana" }como el valor dethis.
- Usamos
- Resultado:
this.namedentro de la función se evalúa como"Ana", y el segundo argumento,"español", se pasa como el idioma.
3.8.2. apply
apply es similar a call, pero los argumentos de la función se pasan como un array o un objeto similar a un array.
Ejemplo con apply
function greet(language) {
console.log(`Hola, soy ${this.name}. Hablo ${language}.`);
}
// Usando apply para establecer el valor de this
greet.apply({ name: "Juan" }, ["inglés"]);
// Resultado: Hola, soy Juan. Hablo inglés.Lenguaje del código: JavaScript (javascript)
Explicación:
- Diferencia clave:
- A diferencia de
call, aquí pasamos los argumentos de la función en un array["inglés"].
- A diferencia de
- Resultado:
this.nametoma el valor"Juan", y el idioma"inglés"se extrae del array.
3.8.3. bind
El método bind no llama inmediatamente a la función. En su lugar, devuelve una nueva función con this permanentemente vinculado al valor que se especifica.
Ejemplo con bind
function greet() {
console.log(`Hola, soy ${this.name}.`);
}
// Usando bind para establecer el valor de this
const greetBound = greet.bind({ name: "María" });
// Llamar a la nueva función
greetBound();
// Resultado: Hola, soy María.Lenguaje del código: JavaScript (javascript)
Explicación:
- Creación de una nueva función:
bindcrea una nueva funcióngreetBounddondethissiempre será{ name: "María" }.
- Uso Posterior:
- Podemos llamar a
greetBounden cualquier momento, ythis.namesiempre será"María".
- Podemos llamar a
3.8.4. Comparación de call, apply y bind
| Método | ¿Cuándo Llama La Función? | ¿Cómo Se Pasan Los Argumentos? | ¿Qué Hace? |
|---|---|---|---|
call | Inmediatamente | Individualmente | Llama a la función con un valor explícito de this. |
apply | Inmediatamente | Como un array | Igual que call, pero los argumentos se pasan en un array. |
bind | No inmediatamente | Individualmente | Devuelve una nueva función con un valor fijo de this. |
3.8.5. Usos comunes
- En clases y componentes:
- Vincular métodos de clase en bibliotecas como React usando
bind.
- Vincular métodos de clase en bibliotecas como React usando
- Con Event Listeners:
- Usar
bindpara asegurar quethisapunte al contexto deseado dentro de un controlador de eventos.
- Usar
- Reutilización de funciones:
- Usar
calloapplypara usar funciones con diferentes objetos sin redefinirlas.
- Usar
Estos métodos son fundamentales para controlar el comportamiento de this en diferentes escenarios, haciendo que JavaScript sea más flexible y dinámico.
4. Problemas comunes con this y cómo solucionarlos
- Confusión con
thisen constructores:- Problema: Si no se utiliza
newpara llamar a un constructor,thisno se referirá al nuevo objeto. - Solución: Siempre utiliza
newpara instanciar objetos a partir de constructores.
- Problema: Si no se utiliza
- Uso incorrecto de
thisen objetos literales:- Problema: Dentro de objetos literales,
thisno se refiere al objeto literal mismo. - Solución: Utiliza una función constructora o una clase para crear objetos y acceder a sus propiedades a través de
this.
- Problema: Dentro de objetos literales,
- Confusión con
thisen objetos globales:- Problema: En el contexto global,
thissuele referirse al objeto global (window en navegadores). - Solución: Utiliza módulos o espacios de nombres para evitar la contaminación del objeto global.
- Problema: En el contexto global,
- Problemas con
thisen métodos de objetos heredados:- Problema: Al llamar a un método heredado, el valor de
thispuede no ser el esperado. - Solución: Utiliza
calloapplypara establecer el valor correcto dethis.
- Problema: Al llamar a un método heredado, el valor de
5. Buenos consejos al usar this en JavaScript.
5.1. Modo estricto ('use strict';)
- Más allá de
this: El modo estricto introduce muchas otras restricciones y beneficios, como la prevención de variables no declaradas, la eliminación de implícitos globales, y la prohibición de ciertas sintaxis obsoletas. - Mejores prácticas: Es altamente recomendable utilizar el modo estricto en todos tus proyectos de JavaScript para escribir código más seguro y robusto.
5.2. Comprender el contexto
- Contexto léxico: El contexto léxico se refiere al ámbito en el que se define una función. Las funciones de flecha heredan el valor de
thisdel contexto léxico. - Contexto dinámico: El contexto dinámico se refiere al objeto que invoca la función.
call,applyybindpermiten modificar el contexto dinámico.
5.3. Utiliza bind con moderación
- Creación de nuevas funciones:
bindcrea una nueva función con un valor fijo dethis. - Sobrecarga: El uso excesivo de
bindpuede generar un exceso de funciones y dificultar la comprensión del código. - Alternativas: Considera usar funciones de flecha o ajustar el contexto de ejecución de la función de manera más directa cuando sea posible.
5.4. Considera las funciones de flecha
- Contexto léxico por defecto: Las funciones de flecha heredan el valor de
thisdel contexto léxico donde se definen, lo que las hace ideales para callbacks y eventos. - Sintaxis concisa: La sintaxis de las funciones de flecha es más concisa que la de las funciones tradicionales.
- Limitaciones: No tienen su propio
this,argumentsoconstructor.
6. Preguntas frecuentes y resumen sobre this en JavaScript.
this es una referencia que apunta al objeto que ejecuta una función. Su valor cambia según el contexto: en un objeto apunta a ese objeto, en una función global es undefined en modo estricto o window en modo normal, y en clases o eventos depende de cómo se invoque la función.
En el contexto global, this apunta a window (o undefined en modo estricto). En métodos de objetos, apunta al objeto. En funciones dentro de eventos, al elemento que dispara el evento. En funciones de flecha, hereda this del contexto exterior.
Dentro de un método de un objeto, this hace referencia al propio objeto. Ejemplo: const obj = {nombre: "JS", saludar() { console.log(this.nombre); }};. Aquí, this.nombre accederá a la propiedad nombre del objeto obj cuando se llame obj.saludar().
En funciones constructoras, this apunta a la nueva instancia creada con new. Ejemplo: function Persona(nombre) { this.nombre = nombre; }. Luego, const p = new Persona("Ana"); asigna this.nombre a «Ana» en la nueva instancia p.
En funciones normales, this depende de cómo se llame la función. En funciones de flecha, this se hereda del contexto en el que se define, sin cambiar su valor. Por eso, las funciones de flecha son útiles para mantener el contexto en métodos y callbacks.
call() y apply() ejecutan una función con this explícito, pasando argumentos directamente o en un array. bind() devuelve una nueva función con this fijo. Ejemplo: miFuncion.call(obj, arg1) o const nueva = miFuncion.bind(obj).
En modo normal, this en funciones globales apunta a window. En modo estricto ("use strict"), this en funciones regulares es undefined. Esto previene errores al trabajar con this sin un contexto explícito.
En eventos, this hace referencia al elemento que disparó el evento. Ejemplo: button.addEventListener("click", function() { console.log(this); }); mostrará el botón. Para mantener this en funciones de flecha, usa button.onclick = () => {...}.
En clases, this representa la instancia del objeto. Ejemplo: class Persona { constructor(nombre) { this.nombre = nombre; } hablar() { console.log(this.nombre); } }. Aquí, this.nombre accede a la propiedad de la instancia creada con new.
Errores comunes incluyen perder el contexto en callbacks (this se vuelve undefined en eventos o temporizadores). Para evitarlo, usa bind(), funciones de flecha o almacena this en una variable (const self = this;) para mantener el contexto.
