La palabra clave this en JavaScript puede resultar confusa porque se comporta de manera diferente en funciones normales y funciones de flecha. En esta publicación de blog, explicaremos cómo funciona esto en ambos tipos de funciones, exploraremos por qué existen estas diferencias y brindaremos el conocimiento básico que necesita para comprender esto en JavaScript.
Las funciones regulares en JavaScript se definen usando la palabra clave function. El valor de this en estas funciones depende de cómo se llama la función. A continuación se muestran varios ejemplos:
function regularFunction() { console.log(this); } regularFunction(); // Logs the global object (window in browsers)
Explicación: En modo no estricto, cuando se llama a una función en el contexto global (no como método de un objeto), esto se refiere al objeto global (ventana en navegadores o global en Node .js).
'use strict'; function regularFunction() { console.log(this); } regularFunction(); // Logs undefined
Cuando se llama a una función como método de un objeto, esto se refiere a ese objeto.
const obj = { method: function() { console.log(this); } }; obj.method(); // Logs obj
Explicación: En este caso, esto apunta a obj porque la función se llama como un método de obj.
Cuando una función se usa como constructor (llamada con la palabra clave new), esto se refiere a la instancia recién creada.
function Person(name) { this.name = name; this.sayHello = function() { console.log(`Hello, my name is ${this.name}`); }; } const person1 = new Person('Alice'); person1.sayHello(); // Logs "Hello, my name is Alice" const person2 = new Person('Bob'); person2.sayHello(); // Logs "Hello, my name is Bob"
Explicación: Cuando se llama con new, esto dentro de la función constructora de Persona se refiere a la nueva instancia que se está creando. Cada nueva instancia (persona1 y persona2) obtiene su propia propiedad de nombre y método sayHello.
Puedes vincular esto explícitamente usando call, apply o bind.
function regularFunction() { console.log(this); } const obj = { value: 42 }; regularFunction.call(obj); // Logs obj regularFunction.apply(obj); // Logs obj const boundFunction = regularFunction.bind(obj); boundFunction(); // Logs obj
Explicación: llamar y aplicar inmediatamente invoca la función con esto configurado en obj, mientras que bind crea una nueva función con esto vinculado permanentemente a obj.
Las funciones de flecha, introducidas en ES6, no tienen su propio contexto. En cambio, heredan esto del ámbito circundante (léxico). Esto hace que las funciones de flecha sean útiles en determinadas situaciones.
Las funciones de flecha heredan esto del alcance en el que están definidas.
const arrowFunction = () => { console.log(this); }; arrowFunction(); // Logs the global object (window in browsers)
Explicación: Las funciones de flecha no tienen su propio this; Usan esto desde el alcance circundante. Aquí, se refiere al objeto global porque la función está definida en el ámbito global.
'use strict'; const arrowFunction = () => { console.log(this); }; arrowFunction(); // Logs undefined
A diferencia de las funciones normales, las funciones de flecha no obtienen su propio this cuando se llaman como métodos. Heredan esto del alcance adjunto.
const obj = { method: () => { console.log(this); } }; obj.method(); // Logs the global object (window in browsers) or undefined in strict mode
Explicación: Las funciones de flecha no vinculan su propio this sino que lo heredan del alcance léxico. En este ejemplo, esto se refiere al objeto global o indefinido en modo estricto, no a obj.
Cuando una función de flecha se define dentro de otra función, la hereda de la función externa.
function outerFunction() { const arrowFunction = () => { console.log(this); }; arrowFunction(); } const obj = { value: 42, outerFunction: outerFunction }; obj.outerFunction(); // Logs obj, because `this` in arrowFunction is inherited from outerFunction
Explicación: En este caso, esto dentro de la función de flecha se refiere a lo mismo que en la función externa, que es obj.
Las funciones de flecha en los controladores de eventos heredan esto del alcance léxico circundante, no del elemento que desencadena el evento.
const button = document.querySelector('button'); button.addEventListener('click', () => { console.log(this); }); // Logs the global object (window in browsers) or undefined in strict mode
Explicación: La función de flecha no vincula esto al elemento del botón; lo hereda del ámbito circundante, que es el ámbito global o indefinido en modo estricto.
La diferencia entre las funciones regulares y las funciones de flecha radica en cómo manejan esto:
Para comprender el comportamiento de esto en JavaScript, necesitas conocer los siguientes conceptos:
Comprender estas distinciones le ayudará a escribir código JavaScript más predecible y fácil de mantener. Ya sea que esté utilizando funciones normales o funciones de flecha, saber cómo funciona es crucial para un desarrollo efectivo de JavaScript.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3