Olá, Thiago! Tudo bem?
Poderia dar um exemplo dessa situação?
Falo isso porque depende. Você está certo no sentido de que o código é lido de cima para baixo, mas não necessariamente a ordem de execução é essa.
Veja bem, no JavaScript temos declarações de funções:
function digaOla() {
console.log('Olá!');
}
E declaração de variáveis com a palavra-chave var
:
var mensagem = 'Olá mundo!';
O código é sempre lido de cima para baixo. No momento de leitura, se houver no início da linha uma dessas palavras-chave (function
e var
), o JavaScript reserva um espaço de memória, basicamente criando esse dado, mesmo que não possua um valor definido (undefined
).
Para evitar esse processo com variáveis, usamos o let
e o const
, e no caso de funções também podemos fazer com let
e const
+ funções anônimas/arrow functions.
Como a condição para esse processo é a primeira palavra da linha ser var
ou function
, ao declarar uma função dentro de parênteses (function () {})
nós também evitamos que esse trecho seja executado fora de ordem.
Outro detalhe, especificamente sobre funções é: declaração é diferente de execução. Então quando declaramos uma função, estamos apenas alocando espaço em memória e criando uma referência (o nome da função, ou da variável) para podermos chamar ela futuramente.
Esses são alguns cenários, e envolvem conceitos avançados de JavaScript, vou deixar alguns materiais a seguir:
- Hoisting - O processo de "elevar" uma linha para fora da ordem;
- Scope - O escopo é como um "container" para certas linhas do seu código, delimitando acesso.
E outros termos que você pode pesquisar sobre:
- Lexical Scope;
- Dynamic Scope;
- Clojures;
Mas não precisa se preocupar muito em entender completamente os conceitos, muito pelo contrário, se te confundir pode deixar para depois.
De toda forma, se você puder específicar o cenário, posso direcionar melhor!
Espero ter ajudado!