Como passar em uma entrevista de JavaScript: principais perguntas
A entrevista para a posição de desenvolvedor JavaScript (especialmente com foco em Node.js) não é apenas uma verificação de sintaxe. Os empregadores querem ver uma compreensão profunda de assincronicidade, escopos e funcionamento do Event Loop. Neste artigo, reunimos as principais perguntas que realmente são feitas em entrevistas, com exemplos de código e explicações.
1. Closures — a base do JS funcional
Pergunta: "O que é uma closure e como ela funciona no Node.js?"
Uma closure é uma função que "lembra" seu ambiente léxico mesmo após a função externa ter terminado sua execução. Este é um mecanismo chave para encapsulamento de dados em JavaScript.
function createCounter() { let count = 0; return function() { count++; return count; };}
const counter = createCounter();console.log(counter()); // 1console.log(counter()); // 2Por que isso é perguntado: Closures estão na base de módulos, fábricas de funções e manipuladores de eventos no Node.js. Sem entender closures, é impossível trabalhar com callbacks assíncronos.
2. Event Loop e assincronicidade (Async/Await, Promises)
Pergunta: "Explique como funciona o Event Loop. O que este código irá exibir?"
console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3'));
console.log('4');Resposta: 1, 4, 3, 2. Primeiro o código síncrono, depois as microtasks (Promise.then), depois as macrotasks (setTimeout).
O Event Loop é o mecanismo que permite ao Node.js executar operações não bloqueantes, apesar de ser single-thread. Ele consiste em várias fases:
- Timers — executam callbacks de setTimeout/setInterval
- I/O callbacks — processamento de operações de entrada/saída concluídas
- Poll — obtenção de novos eventos de I/O
- Check — execução de setImmediate()
- Close callbacks — fechamento de conexões
Dica: Na entrevista, mostre compreensão da diferença entre process.nextTick() e setImmediate(). nextTick é executado antes da próxima fase do Event Loop, enquanto setImmediate é executado na fase Check.
3. Contexto de chamada (this) e arrow functions
Pergunta: "A que é igual this em diferentes situações? Como mudar o contexto?"
O valor de this é determinado por como a função é chamada, não onde ela é declarada. No Node.js (modo estrito), em uma função normal, this será undefined, enquanto no navegador será window.
const obj = { name: 'Node.js', regularFunc: function() { console.log(this.name); }, arrowFunc: () => { console.log(this.name); }};
obj.regularFunc(); // 'Node.js'obj.arrowFunc(); // undefined (this é obtido do contexto externo)Como gerenciar o contexto:
call(thisArg, arg1, arg2)— chama a função com o this e argumentos especificadosapply(thisArg, [args])— similar, mas os argumentos são passados como arraybind(thisArg)— cria uma nova função com o this vinculado- Arrow functions — não têm seu próprio this, usam o contexto léxico
4. Protótipos e herança (Prototype Chain)
Pergunta: "Como funciona a herança prototípica em JavaScript? Qual a diferença das classes?"
JavaScript usa herança prototípica: cada objeto tem uma referência interna [[Prototype]] (acessível via __proto__ ou Object.getPrototypeOf()).
function Animal(name) { this.name = name;}
Animal