Middle
Fale sobre o contexto das funções em JavaScript.
sobes.tech IA
Resposta da IA
O contexto de execução de uma função (this) em JavaScript determina como a função é chamada e quais valores estão disponíveis dentro dela. O contexto muda dinamicamente dependendo da forma como a função é chamada:
- Contexto global: Fora de funções,
thisrefere-se ao objeto global (windowno navegador,globalno Node.js).// No navegador console.log(this === window); // true // No Node.js console.log(this === global); // true - Contexto de função:
- Chamada padrão: Em modo não estrito,
thisdentro de uma função refere-se ao objeto global (se a função não for um método de um objeto). Em modo estrito ("use strict";),thisseráundefined.function showThis() { console.log(this); } showThis(); // Em modo não estrito: Objeto global; Em modo estrito: undefined - Chamada como método de um objeto:
thisrefere-se ao objeto ao qual o método pertence.const user = { name: 'Alice', greet: function() { console.log("Olá, meu nome é " + this.name); } }; user.greet(); // Olá, meu nome é Alice - Com
new(construtor): Cria um novo objeto, que se torna o valor dethisdentro da função construtora, e retorna esse objeto.function Person(name) { this.name = name; } const person1 = new Person('Bob'); console.log(person1.name); // Bob - Indicação explícita do contexto (
call,apply,bind):call(thisArg, arg1, arg2, ...): Chama a função com othisespecificado e os argumentos listados individualmente.apply(thisArg, [argsArray]): Chama a função com othisespecificado e os argumentos em forma de array.bind(thisArg, arg1, arg2, ...): Retorna uma nova função comthisligado permanentemente athisArge com os argumentos ligados.
function introduce(greeting, punctuation) { console.log(greeting + ", eu sou " + this.name + punctuation); } const person = { name: 'Charlie' }; introduce.call(person, "Oi", "!"); // Oi, eu sou Charlie! introduce.apply(person, ["Olá", "."]); // Olá, eu sou Charlie. const boundIntroduce = introduce.bind(person, "Ei"); boundIntroduce("?"); // Ei, eu sou Charlie?
- Chamada padrão: Em modo não estrito,
- Funções arrow: Não têm seu próprio contexto
this. Elas capturamthisdo escopo léxico em que foram definidas.const obj = { name: 'David', sayLater: function() { // `this` aqui refere-se a `obj` setTimeout(() => { // `this` aqui também refere-se a `obj` (herdado de `sayLater`) console.log("Mais tarde, eu sou " + this.name); }, 1000); } }; obj.sayLater(); // Mais tarde, eu sou David