JavaScript

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ícate

Fundamentos 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:

  1. ¿La función se invoca con new? → this es el nuevo objeto creado
  2. ¿La función se llama con call(), apply() o bind()? → this es el objeto especificado
  3. ¿La función se llama como método de un objeto? → this es ese objeto
  4. ¿Es una función flecha? → this retiene el valor del contexto circundante
  5. ¿Ninguna de las anteriores? → this es el objeto global (o undefined 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.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

30 % DE DESCUENTO

Plan mensual

19.00 /mes

13.30 € /mes

Precio normal mensual: 19 €
63 % DE DESCUENTO

Plan anual

10.00 /mes

7.00 € /mes

Ahorras 144 € al año
Precio normal anual: 120 €
Aprende JavaScript online

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

JavaScript
Puzzle

Polimorfismo

JavaScript
Test

Array

JavaScript
Código

Transformación con map()

JavaScript
Test

Gestor de tareas con JavaScript

JavaScript
Proyecto

Manipulación DOM

JavaScript
Test

Funciones

JavaScript
Test

Funciones flecha

JavaScript
Código

Async / Await

JavaScript
Código

Creación y uso de variables

JavaScript
Test

Excepciones

JavaScript
Puzzle

Promises

JavaScript
Código

Funciones cierre (closure)

JavaScript
Test

Herencia

JavaScript
Puzzle

Herencia

JavaScript
Test

Estructuras de control

JavaScript
Código

Selección de elementos DOM

JavaScript
Test

Modificación de elementos DOM

JavaScript
Test

Filtrado con filter() y find()

JavaScript
Test

Funciones cierre (closure)

JavaScript
Puzzle

Funciones

JavaScript
Puzzle

Mapas con Map

JavaScript
Test

Reducción con reduce()

JavaScript
Test

Callbacks

JavaScript
Puzzle

Manipulación DOM

JavaScript
Puzzle

Promises

JavaScript
Test

Async / Await

JavaScript
Test

Eventos del DOM

JavaScript
Puzzle

Async / Await

JavaScript
Puzzle

Promises

JavaScript
Puzzle

Filtrado con filter() y find()

JavaScript
Código

Callbacks

JavaScript
Test

Creación de clases y objetos Restaurante

JavaScript
Código

Reducción con reduce()

JavaScript
Código

Filtrado con filter() y find()

JavaScript
Puzzle

Reducción con reduce()

JavaScript
Puzzle

Conjuntos con Set

JavaScript
Puzzle

Herencia de clases

JavaScript
Código

Eventos del DOM

JavaScript
Test

Clases y objetos

JavaScript
Puzzle

Modificación de elementos DOM

JavaScript
Puzzle

Mapas con Map

JavaScript
Puzzle

Introducción a JavaScript

JavaScript
Test

Funciones

JavaScript
Código

Tipos de datos

JavaScript
Test

Clases y objetos

JavaScript
Test

Array

JavaScript
Test

Conjuntos con Set

JavaScript
Test

Array

JavaScript
Puzzle

Encapsulación

JavaScript
Puzzle

Clases y objetos

JavaScript
Código

Uso de operadores

JavaScript
Puzzle

Uso de operadores

JavaScript
Test

Estructuras de control

JavaScript
Test

Excepciones

JavaScript
Test

Transformación con map()

JavaScript
Puzzle

Funciones flecha

JavaScript
Test

Selección de elementos DOM

JavaScript
Puzzle

Encapsulación

JavaScript
Test

Mapas con Map

JavaScript
Código

Creación y uso de variables

JavaScript
Puzzle

Polimorfismo

JavaScript
Puzzle

Tipos de datos

JavaScript
Puzzle

Estructuras de control

JavaScript
Puzzle

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.

Accede GRATIS a JavaScript y certifícate

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.