Quando o JavaScript precisa descobrir this, segue estas regras em ordem de prioridade (maior sobrescreve menor):
snippettext
1. new Binding (mais alta)2. Explicit Binding (call / apply / bind)3. Implicit Binding (obj.metodo())4. Default Binding (chamada simples)5. Arrow Functions (léxico — caso especial)
Arrow functions não têm this próprio — herdam do escopo envolvente (ES2015).
Regra 1: new Binding
Com new, this é o novo objeto criado:
snippetJavaScript
class Pessoa { constructor(nome) { this.nome = nome; } saudar() { return `Oi, eu sou ${this.nome}`; }} const alice = new Pessoa("Alice");console.log(alice.saudar()); // "Oi, eu sou Alice"
Os 4 passos do new: criar objeto vazio → ligar protótipo → executar construtor com this → retornar objeto.
Regra 2: Explicit Binding
call, apply e bind definem this explicitamente — sobrescrevem binding implícito:
snippetJavaScript
const alice = { nome: "Alice", saudar() { return `Oi, ${this.nome}`; } };const bob = { nome: "Bob" }; alice.saudar.call(bob); // "Oi, Bob" (explícito vence!)
Regra 3: Implicit Binding
Em obj.metodo(), this é o objeto à esquerda do ponto:
snippetJavaScript
const empresa = { nome: "TechCorp", departamento: { nome: "Engenharia", obterNome() { return this.nome; } }}; empresa.departamento.obterNome(); // "Engenharia" (this = departamento)
Armadilha: extrair o método perde o binding:
snippetJavaScript
const saudarFn = usuario.saudar;saudarFn(); // this = undefined (modo estrito)
Comum em callbacks: setTimeout(usuario.saudar, 1000), event handlers, forEach.
Regra 4: Default Binding
Chamada simples funcao() — modo estrito: this = undefined. Sem strict: globalThis.
snippetJavaScript
"use strict";function mostrarThis() { return this; }mostrarThis(); // undefined
Módulos ES6 e classes são automaticamente strict.
Regra 5: Arrow Functions
Sem this próprio — herdam do escopo envolvente:
snippetJavaScript
const usuario = { nome: "Alice", saudarRegular: function() { return this.nome; }, saudarArrow: () => this.nome // this = escopo externo, NÃO usuario!}; usuario.saudarRegular(); // "Alice"usuario.saudarArrow(); // undefined
call, apply e bind não alteram this de arrow functions.