Como é que o JavaScript executa o meu código?
December 21, 2019
Quando escrevemos código em JavaScript, o runtime(Browser/Node) da mesma processa o nosso codigo linha por linha, reserva espaço na memória para as variáveis e funções.
const nome = "Faustino";
function saudacoes(n) {
const result = `Olá ${n}`;
return result;
}
const result = saudacoes(nome);
result; // Olá Faustino
Quando executamos o código acima, o motor do JavaScript cria um Contexto de Execução Global
(em inglês Global Execution Context
)
Contexto de Execução Global
O Contexto de Execução Global é nada mais do que um processo que é responsável por duas simples tarefas:
- Ler o código linha por linha
- Criar memória para todos os dados
Este processo é feito quando executamos uma aplicação ou script, e é restrito ao nível superior(em inglês top-level) do nosso código, em outras palavras isto quer dizer que o Javascript não lê as intruções de códigos que se encontram dentro de funções até as mesmas serem executadas explicitamente.
Thread de execução
O processo de leitura do código linha após linha é também conhecido como Thread
, nesta etapa, tudo o que o Javascript faz é analisar
(em inglês parse
) e executar
o nosso código.
O thread
possui duas caracteristicas, que são:
-
Single thread:
Isto é a limitação que o JavaScript tem de poder simplesmente executar uma instrução de cada vez.
-
Execução síncrona:
Isto é a ordem em que a execução é feita, linha após linha.
Ambiente Global de Variáveis
Nesta fase, o JavaScript simplesmente reserva memória para cada tipo de dados que a gente possui na nossa aplicação, estes dados são guardados na memória do computador e a referência(endereço de cada dado na memória) das mesmas é então atribuída à uma variável.
Quando declaramos variáveis, antes de atribuí-las qualquer tipo de dados, o JavaScript atribui-nas um valor padrão que é undefined
.
Invocando Funções
Ao invocarmos(executar) funções, para cada função o JavaScript cria o então chamado Contexto de Execução Local(em inglês Local Execution Context), este processo é idêntico ao processo global.
É neste processo que efectuamos a leitura de cada linha dentro de cada função. Quando declaramos variáveis dentro do corpo de uma função, elas são simplesmente utilizáveis dentro do contexto léxico da mesma.
O Contexto de Execução Local de cada função é apagado após a execução completa da mesma(quando fazemos um retorno explícito ou implícito).
Próximos tópicos desta série
- Call Stack
- Closure
- Callback/Message/Task Queue
- Event Loop
- Async JS