Middle
Habla sobre el contexto de las funciones en JavaScript.
sobes.tech AI
Respuesta de la IA
El contexto de ejecución de una función (this) en JavaScript determina cómo se llama a la función y qué valores están disponibles dentro de ella. El contexto cambia dinámicamente dependiendo de la forma en que se llama:
- Contexto global: Fuera de funciones,
thishace referencia al objeto global (windowen el navegador,globalen Node.js).// En el navegador console.log(this === window); // true // En Node.js console.log(this === global); // true - Contexto de función:
- Llamada estándar: En modo no estricto,
thisdentro de una función hace referencia al objeto global (si la función no es un método de un objeto). En modo estricto ("use strict";),thisseráundefined.function showThis() { console.log(this); } showThis(); // En modo no estricto: Objeto global; En modo estricto: undefined - Llamada como método de un objeto:
thishace referencia al objeto al que pertenece el método.const user = { name: 'Alice', greet: function() { console.log("Hola, mi nombre es " + this.name); } }; user.greet(); // Hola, mi nombre es Alice - Con
new(constructor): Crea un nuevo objeto, que se convierte en el valor dethisdentro de la función constructora, y devuelve ese objeto.function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob - Indicación explícita del contexto (
call,apply,bind):call(thisArg, arg1, arg2, ...): Llama a la función con elthisespecificado y los argumentos listados individualmente.apply(thisArg, [argsArray]): Llama a la función con elthisespecificado y los argumentos en forma de array.bind(thisArg, arg1, arg2, ...): Devuelve una nueva función conthisligado permanentemente athisArgy con los argumentos ligados.
function introduce(greeting, punctuation) { console.log(greeting + ", soy " + this.name + punctuation); } const person = { name: 'Charlie' }; introduce.call(person, "Hola", "!"); // Hola, soy Charlie! introduce.apply(person, ["Hola", "."]); // Hola, soy Charlie. const boundIntroduce = introduce.bind(person, "Hey"); boundIntroduce("?"); // Hey, soy Charlie?
- Llamada estándar: En modo no estricto,
- Funciones flecha: No tienen su propio contexto
this. Capturanthisdel ámbito léxico en el que fueron definidas.const obj = { name: 'David', sayLater: function() { // `this` aquí hace referencia a `obj` setTimeout(() => { // `this` aquí también hace referencia a `obj` (heredado de `sayLater`) console.log("Luego, soy " + this.name); }, 1000); } }; obj.sayLater(); // Luego, soy David