Guia Do Programador Javascript - LIVRO JAVASCRIPT - GUIA DO PROGRAMADOR - MAURÍCIO SAMY SILVA | Shopee ...
LIVRO JAVASCRIPT - GUIA DO PROGRAMADOR - MAURÍCIO SAMY SILVA | Shopee ...

A maior parte das pessoas que pegam num guia do programador javascript no primeiro mês acham que o problema é a sintaxe. Não é. É que elas não internalizaram como o motor de fato executa código. Você lê "async/await resolve a promise" e pensa que entendeu. Três semanas depois, num projeto real com callbacks aninhados e um state global mutável, trava por duas horas tentando achar onde o bug está.

O que realmente se aprende nos primeiros seis meses

Esquece a ideia de que existe um caminho linear. Closures, event loop, garbage collection, prototipos, hoisting. A ordem em que o MDN ou qualquer curso joga isso pra você raramente é a ordem em que você vai precisar. Eu já vi gente com dois anos de experiência ainda confundindo this dentro de um callback de arrôba com o escopo lexical da arrow function. São coisas diferentes, mas a sintaxe delas se parece tanto que o cérebro curto-circuita. Ao contrário do que a documentação sugere, o garbage collector do V8 não roda a cada alocação. Ele roda em intervalos que dependem da geração do objeto. Objetos na young generation vivem uns 4 ou 5 segundos antes de serem promovidos. Na prática, se você está criando milhares de objetos pequenos num loop de renderização (digamos, uma canvas animando a 60fps), o GC vai fazer micro-pausas de 2 a 4 milissegundos que, acumuladas, derrubam seu frame time de 16ms pra 20ms. O código "funciona". Mas a animação trava de forma aleatória. Não é fácil de diagnosticar porque no profiler parece normal até você olhar o trilha de allocation.

guia do programador javascript: o problema que ninguém te conta sobre event delegation

Event delegation é aquele padrão que todo tutorial mostra: coloca o listener no pai, verifica o event.target, pronto. Funciona pra 90% dos casos. O problema surge quando você tem componentes React (ou Vue, Svelte, whatever) que re-renderizam e destróem e recriam nós DOM a cada update. O delegador tá no document.body, o nó filho sumiu e voltou com outro ID interno. O data-id que você colocou pra identificar o item pode não estar mais lá no momento em que o evento sobe. Eu tive isso num dashboard interno em 2023. Tinha uma tabela virtualizada com 12 mil linhas. Clicava numa ação da linha 7.000 e nada acontecia, mas na linha 12 funcionava. Passou quase um dia inteiro até eu perceber que o framework estava usando pointer-events: none nos placeholders das linhas fora da viewport, e o evento tava sendo disparado no placeholder, não no elemento real. A solução foi parar de delegar no body e delegar no container da tabela virtualizada, com um check extra de event.target.closest('[data-action]'). Cortou o tempo de debug de "um dia" pra "vinte minutos" na próxima vez que precisei refatorar.

👉 Clique no botão abaixo para saber mais sobre o assunto!

O que o código real exige que você saiba

Num guia do programador javascript decente, você vai encontrar a explicação do event loop. Uma file macrotarefa, uma microtarefa entre cada macrotarefa. Ok. Agora multiplica isso pelo fato de que Promise.resolve() agenda uma microtarefa, mas setTimeout(fn, 0) agenda uma macrotarefa com um piso de 4ms no browser (nem é zero, é 4ms no mínimo). Se você tá fazendo polling com setTimeout a 100ms pra atualizar um widget em tempo real, a jitter entre ticks é de uns 15 a 25ms. Não é o 100ms perfeito que você pediu. Pra trabalho serio de timing, requestAnimationFrame ou setInterval com compensação por delta-time sai mais previsível. A diferença entre 4 e 25ms de jitter parece pouco, mas num input de texto com autocomplete que dispara a cada tick, o usuário percebe que às vezes demora meio segundo e às vezes é instantâneo. Outra coisa que quase não aparece em material de estudo: NaN é o número. typeof NaN retorna "number". A comparação NaN !== NaN é true. Se você está fazendo validação de entrada de usuário com parseFloat e depois verificando com if (value !== value) pra checar NaN, funciona. Mas se você fez if (isNaN(value)) e o valor é uma string numérica como "3.14", o isNaN global faz coerção implícita e retorna false, enquanto Number.isNaN("3.14") retorna true. Parece detalhe bobo. Já perdi umas 40 minutos numa PR por causa disso. O tipo coercion implícito do isNaN global é uma bomba relógio em qualquer validação de formulário.

Onde os guias falham e o que fazer

A maioria dos materiais online cobre a linguagem em isolamento. Na prática, 70% do JavaScript que você vai escrever em 2025 é TypeScript com decorators, ou é code que tá falando com uma API REST e manipulando DOM com React. O guia do programador javascript puro te ensina new Map() e WeakRef, mas não te prepara pro fato de que o bundler vai tree-shake metade do que você importou e o chunk que restar vai ter 200KB minificado porque o utilitário matemático que você "simplesmente importou pra uma função" arrastou uma dependência que ninguém usava. Sobre a limitação: JavaScript single-threaded tem um teto duro pra CPU-bound workloads. Se você precisa processar um array de 500 mil pontos pra renderizar em canvas, o worker thread resolve, mas a comunicação entre main thread e worker via postMessage faz deep clone dos objetos. Pra datasets acima de 2MB, isso adiciona uns 80 a 120ms só na serialização. Se a latência for crítica, SharedArrayBuffer com Atomics sai mais rápido, mas exige que o site tenha Cross-Origin-Opener-Policy e Cross-Origin-Embedder-Policy setados nas headers, o que quebra iframe embedding e alguns CDNs. Tem gente que não quer mexer em infrastructures por causa disso e simplesmente divide o processamento em chunks de 50 mil itens chamando await new Promise(r => setTimeout(r)) entre chunks pra dar respiro pro event loop. Ugly, mas funciona sem tocar em headers de rede.

Se alguém tá começando agora e quer um referencial, o MDN ainda é o mais honesto. O "Eloquent JavaScript" é bom pra pensar, mas o exemplo de código tá desatualizado em uns trechos. O guia do programador javascript que eu uso como referência rápida não é um livro, é uma pasta de anotações com 40 snippets que eu copiei de produção ao longo de uns 4 ou 5 anos, anotando onde each breakou e o workaround que funcionou. É menos bonito que um livro, mas responde a pergunta que você realmente faz às três da manhã: "por que esse bug só acontece em produção e não no dev?" Na grande maioria das vezes, é o HMR do webpack não recarregando um módulo específico. Mata o dev server, limpa o node_modules/.cache, roda de novo. Leva uns 90 segundos.