JavaScript
Tutorial JavaScript: this y contexto
JavaScript: Domina el valor de this y predice el contexto de ejecución de funciones para un desarrollo efectivo.
Aprende JavaScript y certifícateFundamentos del valor de this: Determinación dinámica del contexto de ejecución en JavaScript
En JavaScript, la palabra clave this
es uno de los conceptos más fundamentales y a la vez más confusos para muchos desarrolladores. A diferencia de otros lenguajes de programación orientados a objetos, el valor de this
en JavaScript no está determinado por la estructura léxica del código, sino por cómo se invoca la función que lo contiene.
El valor de this
representa el contexto de ejecución actual, es decir, hace referencia al objeto al que pertenece el código que se está ejecutando en un momento determinado. Entender cómo se determina este valor es crucial para escribir código JavaScript efectivo y predecible.
Reglas básicas de determinación de this
El valor de this
se determina siguiendo estas reglas fundamentales:
- 1. Contexto global: Cuando
this
se utiliza fuera de cualquier función o método
console.log(this); // En un navegador, apunta al objeto window
En el contexto global de un navegador, this
hace referencia al objeto window
. En Node.js, this
en el ámbito global se refiere al objeto global
.
- 2. Invocación de función regular: Cuando una función se llama directamente
function showThis() {
console.log(this);
}
showThis(); // En modo no estricto: window (navegador) o global (Node.js)
// En modo estricto: undefined
En modo estricto ('use strict'
), this
será undefined
en funciones regulares, lo que ayuda a prevenir errores accidentales al intentar modificar el objeto global.
- 3. Métodos de objeto: Cuando una función se ejecuta como método de un objeto
const user = {
name: 'Alice',
greet() {
console.log(`Hello, I'm ${this.name}`);
}
};
user.greet(); // "Hello, I'm Alice" - this se refiere al objeto user
Cuando invocamos un método de un objeto, this
hace referencia al objeto que contiene el método. Este es el comportamiento más intuitivo y similar a otros lenguajes orientados a objetos.
- 4. Constructores: Cuando se usa con el operador
new
function User(name) {
this.name = name;
this.isActive = true;
}
const alice = new User('Alice'); // this dentro del constructor apunta al nuevo objeto creado
console.log(alice.name); // "Alice"
Al usar el operador new
, JavaScript crea un nuevo objeto vacío y establece this
para que apunte a ese objeto dentro del constructor.
Comportamiento anidado y pérdida de contexto
Uno de los aspectos más confusos de this
es su comportamiento en funciones anidadas:
const user = {
name: 'Bob',
displayInfo() {
console.log(`Name: ${this.name}`); // "Name: Bob" - this es user
function showDetails() {
console.log(`Details for: ${this.name}`); // undefined o error - this ya no es user
}
showDetails();
}
};
user.displayInfo();
En el ejemplo anterior, dentro de showDetails()
, this
ya no hace referencia al objeto user
, sino al contexto global (o undefined
en modo estricto). Esto se conoce como pérdida de contexto y es una fuente común de errores.
Soluciones tradicionales a la pérdida de contexto
Antes de ES6, los desarrolladores utilizaban principalmente dos técnicas para preservar el valor de this
:
- 1. Almacenar this en una variable:
const user = {
name: 'Bob',
displayInfo() {
const self = this; // Guardar referencia a this
function showDetails() {
console.log(`Details for: ${self.name}`); // Funciona correctamente
}
showDetails();
}
};
user.displayInfo(); // "Details for: Bob"
- 2. Usar bind() para fijar el contexto:
const user = {
name: 'Bob',
displayInfo() {
function showDetails() {
console.log(`Details for: ${this.name}`);
}
const boundFunction = showDetails.bind(this);
boundFunction(); // "Details for: Bob"
}
};
user.displayInfo();
Funciones flecha y lexical this
Las funciones flecha introducidas en ES6 solucionan elegantemente el problema de la pérdida de contexto, ya que no crean su propio contexto de this
, sino que heredan el valor de this
del ámbito léxico circundante:
const user = {
name: 'Bob',
displayInfo() {
console.log(`Name: ${this.name}`); // "Name: Bob"
// La función flecha hereda this del ámbito que la contiene
const showDetails = () => {
console.log(`Details for: ${this.name}`); // "Details for: Bob"
};
showDetails();
}
};
user.displayInfo();
Este comportamiento de las funciones flecha es una de las razones por las que se han vuelto tan populares en el desarrollo moderno de JavaScript.
Determinación de this en eventos del DOM
En los manejadores de eventos del DOM, this
generalmente hace referencia al elemento que disparó el evento:
const button = document.querySelector('button');
button.addEventListener('click', function() {
console.log(this); // Hace referencia al elemento button
this.textContent = 'Clicked!';
});
// Con función flecha, this NO referencia al botón:
button.addEventListener('click', () => {
console.log(this); // window o undefined (depende del contexto)
});
Este es un caso donde las funciones flecha pueden no ser la mejor opción si necesitamos acceder al elemento que disparó el evento a través de this
.
Resumen de reglas de determinación
Para determinar el valor de this
en cualquier punto de tu código, pregúntate:
- ¿La función se invoca con
new
? →this
es el nuevo objeto creado - ¿La función se llama con
call()
,apply()
obind()
? →this
es el objeto especificado - ¿La función se llama como método de un objeto? →
this
es ese objeto - ¿Es una función flecha? →
this
retiene el valor del contexto circundante - ¿Ninguna de las anteriores? →
this
es el objeto global (oundefined
en modo estricto)
Entender estas reglas fundamentales te permitirá predecir y controlar el comportamiento de this
en tus aplicaciones JavaScript, evitando errores comunes relacionados con el contexto de ejecución.
Control y manipulación del contexto: Técnicas para vincular, cambiar y preservar el valor de this
Una vez comprendido cómo JavaScript determina el valor de this
, es fundamental conocer las técnicas específicas que nos permiten controlar y manipular este contexto de forma explícita. Estas herramientas nos dan el poder de decidir exactamente a qué debe apuntar this
en nuestras funciones, independientemente de cómo sean invocadas.
Métodos para manipular el contexto
JavaScript proporciona tres métodos principales para controlar explícitamente el valor de this
:
- 1. call(): Ejecuta una función estableciendo un valor específico para
this
y argumentos individuales
function introduce(greeting, punctuation) {
console.log(`${greeting}, I'm ${this.name}${punctuation}`);
}
const person = { name: 'Emma' };
introduce.call(person, 'Hello', '!'); // "Hello, I'm Emma!"
El primer argumento de call()
define el valor de this
dentro de la función, mientras que los argumentos restantes se pasan como parámetros a la función invocada.
- 2. apply(): Similar a
call()
, pero recibe los argumentos como un array
function introduce(greeting, punctuation) {
console.log(`${greeting}, I'm ${this.name}${punctuation}`);
}
const developer = { name: 'Carlos' };
const args = ['Hi', '!'];
introduce.apply(developer, args); // "Hi, I'm Carlos!"
La diferencia principal con call()
es la forma de pasar los argumentos: apply()
acepta un array, lo que resulta útil cuando el número de argumentos es variable o desconocido.
- 3. bind(): Crea una nueva función con
this
permanentemente vinculado al valor especificado
function showDetails() {
console.log(`Name: ${this.name}, Role: ${this.role}`);
}
const employee = {
name: 'Sarah',
role: 'Developer'
};
const boundFunction = showDetails.bind(employee);
// La función resultante mantiene el contexto incluso si se pasa como callback
boundFunction(); // "Name: Sarah, Role: Developer"
// El contexto permanece vinculado incluso si intentamos cambiarlo
boundFunction.call({name: 'John', role: 'Manager'}); // Sigue mostrando "Name: Sarah, Role: Developer"
A diferencia de call()
y apply()
que ejecutan la función inmediatamente, bind()
devuelve una nueva función con el contexto fijado permanentemente, lo que resulta ideal para callbacks y manejadores de eventos.
Aplicaciones prácticas de la manipulación de contexto
Préstamo de métodos (Method borrowing)
Una técnica poderosa es "tomar prestados" métodos de otros objetos:
const calculator = {
multiply(a, b) {
return a * b;
}
};
const scientific = {
square(x) {
// Préstamo del método multiply para calcular x²
return calculator.multiply.call(this, x, x);
}
};
console.log(scientific.square(4)); // 16
Parcialización de funciones (Partial application)
bind()
también permite crear funciones parcialmente aplicadas, fijando algunos argumentos:
function calculateTax(rate, amount) {
return amount * rate;
}
// Creamos una función específica para el IVA español (21%)
const calculateVAT = calculateTax.bind(null, 0.21);
console.log(calculateVAT(100)); // 21
console.log(calculateVAT(200)); // 42
Observa que usamos null
como primer argumento porque no necesitamos manipular this
en este caso, solo queremos fijar el primer parámetro.
Preservación del contexto en situaciones complejas
En callbacks asíncronos
Los callbacks asíncronos suelen ejecutarse en un contexto diferente, lo que puede causar problemas:
const userService = {
username: 'admin',
fetchData() {
setTimeout(function() {
console.log(`Data for user: ${this.username}`);
}, 1000);
// ❌ Problema: this.username será undefined
}
};
userService.fetchData(); // "Data for user: undefined"
Soluciones:
const userService = {
username: 'admin',
// Solución 1: Usar bind()
fetchDataWithBind() {
setTimeout(function() {
console.log(`Data for user: ${this.username}`);
}.bind(this), 1000);
},
// Solución 2: Usar una función flecha
fetchDataWithArrow() {
setTimeout(() => {
console.log(`Data for user: ${this.username}`);
}, 1000);
},
// Solución 3: Guardar referencia a this
fetchDataWithVar() {
const self = this;
setTimeout(function() {
console.log(`Data for user: ${self.username}`);
}, 1000);
}
};
userService.fetchDataWithBind(); // "Data for user: admin"
userService.fetchDataWithArrow(); // "Data for user: admin"
userService.fetchDataWithVar(); // "Data for user: admin"
En manejadores de eventos
Cuando necesitamos acceder tanto al elemento que disparó el evento como a datos de un objeto:
class UserInterface {
constructor() {
this.username = 'guest';
this.setupEventListeners();
}
setupEventListeners() {
const loginButton = document.getElementById('loginBtn');
// Problema: perderíamos acceso a this.username
// loginButton.addEventListener('click', function() {...});
// Solución: usar bind para mantener el contexto de la clase
loginButton.addEventListener('click', this.handleLogin.bind(this));
}
handleLogin(event) {
// Acceso al elemento que disparó el evento
event.target.disabled = true;
// Acceso a las propiedades de la clase
console.log(`Logging in as ${this.username}`);
}
}
const ui = new UserInterface();
Técnicas avanzadas con this
Composición de funciones con contexto preservado
Podemos crear cadenas de funciones que preserven el contexto:
function compose(fn1, fn2) {
return function() {
return fn2.call(this, fn1.apply(this, arguments));
};
}
const user = {
name: 'David',
getFormattedName() {
return this.name.toUpperCase();
},
greet(name) {
return `Hello, ${name}!`;
}
};
// Componemos las funciones preservando el contexto
const greetWithFormattedName = compose(
user.getFormattedName,
user.greet
).bind(user);
console.log(greetWithFormattedName()); // "Hello, DAVID!"
Implementación de mixins con contexto compartido
Los mixins permiten compartir funcionalidad entre objetos:
const loggerMixin = {
log(message) {
console.log(`[${this.name}]: ${message}`);
},
warn(message) {
console.warn(`[${this.name}] WARNING: ${message}`);
}
};
class Service {
constructor(name) {
this.name = name;
}
// Añadimos los métodos del mixin preservando el contexto
initialize() {
this.log = loggerMixin.log.bind(this);
this.warn = loggerMixin.warn.bind(this);
}
}
const authService = new Service('AuthService');
authService.initialize();
authService.log('User authenticated'); // "[AuthService]: User authenticated"
authService.warn('Login attempts exceeded'); // "[AuthService] WARNING: Login attempts exceeded"
Patrones de diseño que aprovechan la manipulación de contexto
Patrón Decorator con preservación de contexto
function loggingDecorator(originalMethod, methodName) {
return function(...args) {
console.log(`Calling ${methodName} with:`, args);
const result = originalMethod.apply(this, args);
console.log(`${methodName} returned:`, result);
return result;
};
}
class Calculator {
add(a, b) {
return a + b;
}
}
const calc = new Calculator();
// Decoramos el método manteniendo el contexto original
calc.add = loggingDecorator(calc.add, 'add');
calc.add(5, 3);
// Logs:
// "Calling add with: [5, 3]"
// "add returned: 8"
Este patrón es especialmente útil para añadir funcionalidades como logging, validación o medición de rendimiento sin modificar la implementación original.
La manipulación efectiva del contexto en JavaScript nos permite escribir código más flexible, reutilizable y mantenible, adaptando el comportamiento de nuestras funciones según las necesidades específicas de cada situación.
Contexto en patrones y frameworks modernos: Comportamiento de this en clases, módulos y entornos asíncronos
El comportamiento de this
en JavaScript evoluciona constantemente con los nuevos patrones de diseño y frameworks modernos. Entender cómo funciona el contexto en estos entornos es fundamental para desarrollar aplicaciones robustas y evitar errores sutiles que pueden ser difíciles de depurar.
Comportamiento de this en clases de ES6
Las clases introducidas en ES6 proporcionan una sintaxis más clara para trabajar con objetos y prototipos, pero el comportamiento de this
sigue las mismas reglas fundamentales:
class TaskManager {
constructor(name) {
this.name = name;
this.tasks = [];
}
addTask(task) {
this.tasks.push(task);
console.log(`Task added by ${this.name}`);
}
printTasks() {
console.log(`${this.name}'s tasks:`);
this.tasks.forEach(function(task) {
// ⚠️ Problema: this.name es undefined aquí
console.log(`- ${task} (added by ${this.name})`);
});
}
printTasksFixed() {
console.log(`${this.name}'s tasks:`);
// ✅ Solución: usar función flecha para preservar el contexto
this.tasks.forEach(task => {
console.log(`- ${task} (added by ${this.name})`);
});
}
}
const manager = new TaskManager('Alice');
manager.addTask('Review code');
manager.printTasks(); // Problema con this.name
manager.printTasksFixed(); // Funciona correctamente
Las clases en JavaScript tienen algunas particularidades importantes respecto al contexto:
- Los métodos de clase no están automáticamente vinculados a la instancia, a diferencia de algunos otros lenguajes orientados a objetos.
- Los métodos de clase estáticos tienen
this
referenciando a la clase misma, no a una instancia.
class User {
static count = 0;
constructor(name) {
this.name = name;
User.incrementCount();
}
static incrementCount() {
// this se refiere a la clase User, no a una instancia
this.count++;
console.log(`Total users: ${this.count}`);
}
static getCount() {
return this.count;
}
}
const user1 = new User('John'); // "Total users: 1"
const user2 = new User('Emma'); // "Total users: 2"
console.log(User.getCount()); // 2
Campos de clase y métodos de clase
Las propuestas más recientes de JavaScript incluyen campos de clase y métodos de clase vinculados automáticamente, que resuelven muchos problemas comunes con this
:
class EventHandler {
// Campo de clase (propiedad)
name = 'Default Handler';
// Método vinculado automáticamente usando campo de clase con función flecha
handleClick = (event) => {
console.log(`${this.name} processed click at ${event.target.id}`);
}
registerEvents() {
const button = document.getElementById('actionBtn');
// No necesitamos .bind(this) gracias al método vinculado
button.addEventListener('click', this.handleClick);
}
}
const handler = new EventHandler();
handler.registerEvents();
Esta sintaxis evita la necesidad de usar .bind(this)
o almacenar referencias a this
en variables, haciendo el código más limpio y menos propenso a errores.
Comportamiento de this en módulos ES
Los módulos ES tienen su propio ámbito léxico, lo que afecta al comportamiento de this
en el nivel superior:
// En un módulo ES (archivo .mjs o <script type="module">)
console.log(this); // undefined en modo estricto (los módulos siempre usan modo estricto)
// En un script normal (no módulo)
console.log(this); // objeto window en navegadores
Dentro de los módulos, es común usar patrones que evitan depender del valor de this
en el nivel superior:
// userService.js
let currentUser = null;
export function login(username) {
currentUser = { username, loggedIn: true };
return currentUser;
}
export function getCurrentUser() {
return currentUser;
}
// No dependemos de this en el nivel del módulo
Contexto en entornos asíncronos modernos
Promises y this
Las promesas mantienen el contexto léxico donde fueron creadas, pero necesitan atención especial en los callbacks:
class DataService {
constructor(apiUrl) {
this.apiUrl = apiUrl;
this.data = null;
}
fetchData() {
return fetch(this.apiUrl)
.then(response => response.json())
.then(function(data) {
// ⚠️ Problema: this.data sería undefined aquí
this.data = data;
return data;
});
}
fetchDataFixed() {
return fetch(this.apiUrl)
.then(response => response.json())
.then(data => {
// ✅ Solución: la función flecha preserva this
this.data = data;
return data;
});
}
}
const service = new DataService('https://api.example.com/data');
service.fetchDataFixed().then(data => console.log(data));
Async/Await y contexto
El patrón async/await
simplifica el manejo de operaciones asíncronas y preserva naturalmente el contexto:
class UserRepository {
constructor(dbClient) {
this.dbClient = dbClient;
this.collection = 'users';
}
async findById(id) {
try {
// this se refiere correctamente a la instancia de UserRepository
const user = await this.dbClient.query(this.collection, { id });
return user;
} catch (error) {
console.error(`Error in ${this.collection} repository:`, error);
throw error;
}
}
async saveAll(users) {
// Las funciones async mantienen el contexto como las funciones normales
const results = await Promise.all(
users.map(async user => {
// this sigue siendo accesible aquí
return this.dbClient.insert(this.collection, user);
})
);
return results;
}
}
El uso de async/await
generalmente resulta en código más limpio y con menos problemas de contexto que las cadenas de promesas con callbacks.
Contexto en frameworks modernos
React y this
React ha evolucionado en su manejo del contexto, desde componentes de clase hasta hooks:
// Componente de clase (enfoque tradicional)
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
// Necesitamos vincular manualmente los métodos
this.increment = this.increment.bind(this);
}
increment() {
this.setState({ count: this.state.count + 1 });
}
// Alternativa: método como propiedad de clase (función flecha)
decrement = () => {
this.setState({ count: this.state.count - 1 });
}
render() {
return (
<div>
<p>Count: {this.state.count}</p>
<button onClick={this.increment}>+</button>
<button onClick={this.decrement}>-</button>
</div>
);
}
}
// Componente funcional con hooks (enfoque moderno)
function CounterHooks() {
// No hay problemas con this en componentes funcionales
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>+</button>
<button onClick={() => setCount(count - 1)}>-</button>
</div>
);
}
Los componentes funcionales y hooks de React eliminan casi por completo los problemas relacionados con this
, lo que ha contribuido significativamente a su adopción.
Vue.js y this
Vue utiliza un sistema de reactividad donde this
dentro de los métodos de componentes apunta a la instancia del componente:
// Vue 3 Options API
const Counter = {
data() {
return {
count: 0
};
},
methods: {
increment() {
// this se refiere automáticamente a la instancia del componente
this.count++;
},
logCount() {
console.log(`Current count: ${this.count}`);
}
},
mounted() {
// También aquí this es la instancia del componente
console.log(`Initial count: ${this.count}`);
// Cuidado con las funciones anidadas
setTimeout(function() {
// ⚠️ this no es la instancia del componente aquí
this.logCount(); // Error
}, 1000);
// Solución: usar función flecha
setTimeout(() => {
// ✅ this preserva el contexto del componente
this.logCount();
}, 1000);
}
};
Vue 3 también ofrece la Composition API, que reduce la dependencia de this
:
import { ref, onMounted } from 'vue';
// Vue 3 Composition API
export default {
setup() {
// No dependemos de this
const count = ref(0);
function increment() {
count.value++;
}
onMounted(() => {
console.log(`Initial count: ${count.value}`);
});
return {
count,
increment
};
}
};
Patrones modernos para gestionar el contexto
Inyección de dependencias
La inyección de dependencias reduce la necesidad de acceder a this
para obtener servicios o configuraciones:
class OrderService {
constructor(paymentGateway, notificationService, config) {
this.paymentGateway = paymentGateway;
this.notificationService = notificationService;
this.config = config;
}
async processOrder(order) {
// Usamos las dependencias inyectadas en lugar de this.someGlobalService
const payment = await this.paymentGateway.charge(order.total);
if (payment.success) {
await this.notificationService.notify(
order.customer.email,
'Order Confirmation',
`Your order #${order.id} has been processed.`
);
}
return { order, payment };
}
}
// Uso
const orderProcessor = new OrderService(
new PaymentGateway(API_KEY),
new EmailService(),
{ taxRate: 0.21 }
);
Composición funcional
Los patrones de composición funcional evitan problemas de contexto al minimizar el uso de this
:
// Enfoque funcional sin this
function createUserService(apiClient) {
// Clausura que captura apiClient
return {
getUser: async (id) => {
const response = await apiClient.get(`/users/${id}`);
return response.data;
},
updateUser: async (id, data) => {
const response = await apiClient.put(`/users/${id}`, data);
return response.data;
},
deleteUser: async (id) => {
await apiClient.delete(`/users/${id}`);
return { success: true };
}
};
}
// Uso
const userService = createUserService(axios);
userService.getUser(123).then(user => console.log(user));
Este enfoque utiliza clausuras en lugar de this
para mantener el estado, resultando en código más predecible y testeable.
Consideraciones de rendimiento y mejores prácticas
- Evita vincular métodos en renderizados: Vincular métodos o crear funciones flecha en cada renderizado puede afectar el rendimiento.
// ❌ Evitar esto en componentes React
render() {
return <button onClick={() => this.handleClick()}>Click</button>;
}
// ✅ Mejor práctica
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
render() {
return <button onClick={this.handleClick}>Click</button>;
}
Usa campos de clase para métodos vinculados: Los campos de clase con funciones flecha son una solución elegante para métodos que necesitan preservar
this
.Considera alternativas funcionales: Cuando sea posible, considera enfoques funcionales que no dependan de
this
.
El manejo adecuado del contexto en JavaScript moderno requiere comprender tanto los fundamentos tradicionales como los nuevos patrones emergentes. A medida que el lenguaje y sus frameworks evolucionan, las soluciones para gestionar this
se vuelven más elegantes y menos propensas a errores, permitiéndonos escribir código más mantenible y predecible.
Ejercicios de esta lección this y contexto
Evalúa tus conocimientos de esta lección this y contexto con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Funciones flecha
Polimorfismo
Array
Transformación con map()
Gestor de tareas con JavaScript
Manipulación DOM
Funciones
Funciones flecha
Async / Await
Creación y uso de variables
Excepciones
Promises
Funciones cierre (closure)
Herencia
Herencia
Estructuras de control
Selección de elementos DOM
Modificación de elementos DOM
Filtrado con filter() y find()
Funciones cierre (closure)
Funciones
Mapas con Map
Reducción con reduce()
Callbacks
Manipulación DOM
Promises
Async / Await
Eventos del DOM
Async / Await
Promises
Filtrado con filter() y find()
Callbacks
Creación de clases y objetos Restaurante
Reducción con reduce()
Filtrado con filter() y find()
Reducción con reduce()
Conjuntos con Set
Herencia de clases
Eventos del DOM
Clases y objetos
Modificación de elementos DOM
Mapas con Map
Introducción a JavaScript
Funciones
Tipos de datos
Clases y objetos
Array
Conjuntos con Set
Array
Encapsulación
Clases y objetos
Uso de operadores
Uso de operadores
Estructuras de control
Excepciones
Transformación con map()
Funciones flecha
Selección de elementos DOM
Encapsulación
Mapas con Map
Creación y uso de variables
Polimorfismo
Tipos de datos
Estructuras de control
Todas las lecciones de JavaScript
Accede a todas las lecciones de JavaScript y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Introducción A Javascript
Introducción Y Entorno
Tipos De Datos
Sintaxis
Variables
Sintaxis
Operadores
Sintaxis
Estructuras De Control
Sintaxis
Funciones
Sintaxis
Funciones Cierre (Closure)
Sintaxis
Arrays Y Métodos
Estructuras De Datos
Conjuntos Con Set
Estructuras De Datos
Mapas Con Map
Estructuras De Datos
Funciones Flecha
Programación Funcional
Filtrado Con Filter() Y Find()
Programación Funcional
Transformación Con Map()
Programación Funcional
Reducción Con Reduce()
Programación Funcional
Clases Y Objetos
Programación Orientada A Objetos
Excepciones
Programación Orientada A Objetos
Encapsulación
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Manipulación Dom
Dom
Selección De Elementos Dom
Dom
Modificación De Elementos Dom
Dom
Eventos Del Dom
Dom
Callbacks
Programación Asíncrona
Promises
Programación Asíncrona
Async / Await
Programación Asíncrona
Certificados de superación de JavaScript
Supera todos los ejercicios de programación del curso de JavaScript y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender la dinámica del contexto de JavaScript.\n- Aprender las reglas de determinación del valor de this.\n- Aplicar métodos para manipular el contexto.\n- Evitar la pérdida de contexto en funciones anidadas.\n- Usar call, apply, y bind eficientemente.\n- Adoptar funciones flecha para reducir errores de contexto.