Skip to content

Escopos

Leonel Sanches da Silva edited this page Jan 24, 2022 · 8 revisions

Escopos são momentos na execução de um programa em que certos elementos existem ou não, tais como variáveis, funções, objetos, etc., e são definidos por blocos de escopo.

Blocos de escopo normalmente são usados para definir funções, métodos e classes, mas Delégua suporta blocos de escopo órfãos, como no exemplo abaixo:

{ // Isso é um bloco de escopo órfão, ou seja, não pertence a qualquer estrutura da linguagem, 
  // como uma classe, uma função ou um método
  var a = "1";
}

escreva(a); // sinaliza erro, porque `a` foi declarada dentro de um bloco de escopo que já finalizou sua execução.

se (a == "1") { // Este bloco de escopo pertence à instrução `se`, e é executado quando a é igual ao literal "1", um texto.
  escreva("A variável `a` tem o valor '1'.")
}

Blocos de escopo são declarados entre chaves, { e }.

Toda execução de Delégua, seja pelo modo LAIR, seja pela execução de um programa, possui um escopo padrão, também chamado de escopo global, implicitamente declarado. É nele que ficam variáveis e funções globais.

Variáveis declaradas no escopo global podem ser acessadas por um escopo mais interno, mas o contrário não é possível (como no exemplo anterior do escopo órfão). O exemplo a seguir demonstra como é possível acessar uma variável definida no escopo global por um bloco de escopo órfão.

var a = "1";
{
  escreva(a); // escreve 1, pois um escopo mais restritivo tem acesso ao escopo ao qual foi declarado.
}

O escopo interno pode alterar variáveis de escopos ancestrais sem necessidade de nova declaração.

var a = "1";
{
  a = "2";
}

escreva(a); // escreve 2

No entanto, se uma nova variável é declarada dentro de um escopo filho com o mesmo nome de outra variável num escopo pai, a variável declarada no escopo pai não pode mais ser acessada pelo nome no escopo filho.

var a = "1";
{
  var a = "2";
  escreva(a); // escreve 2
}

escreva(a); // escreve 1