Como passar em uma entrevista de JavaScript: nível avançado

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Como passar em uma entrevista de JavaScript: principais questões de nível avançado



A entrevista para uma posição de desenvolvedor JavaScript Sênior ou Pleno não é apenas uma verificação de sintaxe. Os entrevistadores querem ver uma compreensão profunda dos mecanismos de funcionamento da linguagem, especialmente no ambiente Node.js. Neste artigo, analisaremos os tópicos principais que frequentemente causam dificuldades e daremos exemplos de código que o ajudarão a responder com confiança às perguntas mais complicadas.



1. Closures e escopo léxico



A pergunta sobre closures é um clássico. Mas em nível avançado, é importante não apenas dar uma definição, mas mostrar como as closures funcionam com let, const e em loops.



Pergunta: O que o código a seguir exibirá e por quê?



for (var i = 0; i < 3; i++) {  setTimeout(() => console.log(i), 100);}// Saída: 3, 3, 3


O problema é que var tem escopo de função, e não de bloco. No momento em que os callbacks são chamados, o loop já terminou e i é igual a 3. A solução é usar let (cria uma nova vinculação a cada iteração) ou envolver a chamada em uma closure:



for (var i = 0; i < 3; i++) {  (function(j) {    setTimeout(() => console.log(j), 100);  })(i);}// Saída: 0, 1, 2


Em Node.js, closures são ativamente usadas para criar variáveis privadas e fábricas de funções. Por exemplo, ao escrever middleware:



function createLogger(prefix) {  return function(message) {    console.log(`[${prefix}] ${message}`);  };}const infoLog = createLogger('INFO');infoLog('Servidor iniciado'); // [INFO] Servidor iniciado


2. Event Loop e Microtasks



Compreender o ciclo de eventos é um dos principais critérios de avaliação. Os entrevistadores gostam de dar tarefas sobre a ordem de execução de código assíncrono.



Pergunta: Em que ordem os console.log serão executados?



console.log('1');

setTimeout(() => console.log('2'), 0);

Promise.resolve().then(() => console.log('3'));

process.nextTick(() => console.log('4'));

console.log('5');

// Saída: 1, 5, 4, 3, 2


Análise:

  • console.log('1') e console.log('5') — síncronos, executados primeiro.
  • process.nextTick — é uma microtask com a prioridade mais alta. Ela é executada imediatamente após a conclusão da fase atual.
  • Promise.then — também é uma microtask, mas com prioridade ligeiramente menor que nextTick.
  • setTimeout(fn, 0) — é uma macrotask, executada no próximo tick do Event Loop.


Para Node.js, é importante lembrar sobre process.nextTick e setImmediate. A diferença é que nextTick é executado antes de qualquer operação de I/O, enquanto setImmediate é executado depois.



3. Promises e iteradores assíncronos (Async/Await)



O nível avançado implica a capacidade de trabalhar com cadeias de promises, tratamento de erros e execução paralela.



Pergunta: Como processar várias requisições assíncronas para executá-las em paralelo, mas aguardar todos os resultados?



const fetchData = (id) => {  return new Promise((resolve) => {    setTimeout(() => resolve(`Dados para ID: ${id}`), id * 100);  });};

async function getAllData() { const ids = [1, 2, 3]; const promises = ids.map(id => fetchData(id)); const results = await Promise.all(promises); console.log(results); // ['Dados para ID: 1', 'Dados para ID: 2', 'Dados para ID: 3']}

getAllData();


Observação importante: Promise.all rejeita toda a promise no primeiro erro. Se você precisar obter todos os resultados (mesmo com erros), use Promise.allSettled. Este é um tópico frequente em entrevistas no contexto

Blogs

Book Recommendations