En términos sencillos, this es una palabra clave especial en JavaScript que se refiere al objeto actual o contexto de ejecución en el que una función está siendo llamada.
En JavaScript el comportamiento de this es uno de los conceptos que más cuestan entender, porque es algo diferente del de la mayoría de lenguajes.
Lo importante es que this siempre hace referencia al contexto de ejecución de la función. Este contexto de ejecución puede ser:
- El contexto global al llamar una función desde fuera de un objeto
- El objeto que llama a un método desde dentro del objeto.
- Un objeto específico que “forzamos” explícitamente (mediante métodos
call(),apply(), obind()).
Vamos a ver cada uno de ellos detalladamente 👇
Comportamiento de this
En JavaScript, el valor de this depende de cómo se llama a la función, no de cómo está definida.
En funciones normales
Cuando se invoca una función de manera simple (sin utilizar objetos ni métodos especiales), this hace referencia al contexto global.
function saludar() {
console.log(this); // `this` hace referencia al objeto global
console.log("¡Hola!");
}
saludar();En este caso, cuando se ejecuta saludar(), el valor de this es el objeto global. (window en un navegador o global en Node.js)
En modo estricto ("use strict";), this no se refiere al objeto global, sino que será undefined.
Desde métodos de objetos
Cuando una función es invocada como un método de un objeto, el valor de this hace referencia al objeto al que pertenece el método.
const persona = {
nombre: "Luis",
saludar: function() {
console.log(this.nombre); // `this` hace referencia al objeto `persona`
}
};
persona.saludar(); // Salida: "Luis"En este caso, cuando se invoca persona.saludar(), this se refiere al objeto persona, lo que permite acceder a la propiedad nombre dentro del método.
Pérdida del objeto this
Una de las cosas que más quebraderos da con this es que es fácil que podamos “perder” la referencia del objeto que queríamos.
Cuando definimos una función dentro de un método, si no se tiene cuidado, this podría hacer referencia al objeto global en lugar del objeto esperado.
const persona = {
nombre: "Luis",
saludar: function() {
function saludarInterno() {
console.log(this.nombre); // `this` hace referencia al objeto global
}
saludarInterno();
}
};
persona.saludar(); // Error: `this.nombre` es `undefined`, ya que `this` es el objeto globalEn este ejemplo,
- Dentro de
saludar(), definimos la funciónsaludarInterno(). - Sin embargo,
thisensaludarInterno()no hace referencia apersona, sino al contexto global - Esto puede causa que la propiedad
nombreno se pueda acceder correctamente.
this en funciones flecha
Las funciones flecha en JavaScript tienen un comportamiento especial con respecto a this.
En lugar de establecer su propio valor de this, las funciones flecha heredan el valor de this del contexto léxico en el que fueron definidas.
const persona = {
nombre: "Luis",
saludar: function() {
const decirHola = () => {
console.log("¡Hola, soy " + this.nombre); // `this` se refiere a `persona`
};
decirHola();
}
};
persona.saludar(); // "¡Hola, soy Luis"En este caso,
personaes un objeto con una propiedadnombrey un métodosaludar.- Dentro del método
saludar, definimos una función flecha llamadadecirHola. - La función flecha hereda el contexto de
thisdel métodosaludar, que apunta al objetopersona. - Al llamar a
decirHola, utiliza el valor “correcto” dethisy accede a persona.nombre.
Modificar explícitamente
En JavaScript, podemos modificar explícitamente el valor de this usando los métodos call(), apply() y bind().
Estos métodos permiten establecer el contexto de ejecución para una función, independientemente de cómo se invoca.
Lo vemos en la entrada Cómo funciona Call, Apply y Bind en JavaScript
Resumenazo de todo lo que hemos visto:
- En funciones normales,
thishace referencia al contexto global. - En métodos de objetos,
thisse refiere al objeto que contiene el método. - En funciones dentro de métodos, es necesario tener cuidado, ya que
thispuede cambiar según el contexto de la función interna. - Funciones flecha no tienen su propio
this, sino que heredan elthisde su contexto léxico. - call(), apply() y bind() permiten cambiar explícitamente el valor de
thisal invocar una función.