O que são escopo léxico e escopo dinâmico e quais são suas principais diferenças?

O escopo léxico e o escopo dinâmico são conceitos relacionados à forma como as variáveis são acessadas e avaliadas em uma linguagem de programação.

O escopo léxico, também conhecido como escopo estático, determina a visibilidade e o tempo de vida de uma variável com base na estrutura estática do código. Em outras palavras, durante a compilação ou análise estática, o escopo léxico é definido com base na posição física da variável no código fonte. Isso significa que o escopo é determinado pelo local onde a variável é definida dentro de uma função ou bloco de código.

Por exemplo, considere o seguinte código em JavaScript:

function foo() {
  var x = 10;
  function bar() {
    console.log(x);
  }
  bar();
}

foo();

Nesse caso, a variável x tem escopo léxico dentro da função foo, e a função bar pode acessá-la porque está definida dentro do mesmo escopo léxico.

Já o escopo dinâmico determina a visibilidade e o tempo de vida de uma variável com base na chamada em tempo de execução. Ou seja, o escopo é determinado pelo fluxo de execução em vez da estrutura estática do código.

Considere o seguinte código em Python:

def foo():
  x = 10
  def bar():
    print(x)
  bar()

foo()

Nesse caso, a variável x tem escopo léxico dentro da função foo, mas a função bar também é capaz de acessar a variável x porque ela é resolvida dinamicamente no momento da execução.

A principal diferença entre os dois é que o escopo léxico é determinado em tempo de compilação ou análise estática, enquanto o escopo dinâmico é determinado em tempo de execução. No escopo léxico, as variáveis são acessadas com base em sua posição no código fonte, independentemente de como ou onde são chamadas. Já no escopo dinâmico, as variáveis são resolvidas com base no fluxo de execução do programa, considerando o contexto da chamada atual.

Muitas linguagens de programação modernas usam o escopo léxico como padrão, pois oferece mais previsibilidade e facilidade de rastreamento de variáveis. No entanto, algumas linguagens oferecem escopo dinâmico como recurso opcional.