028 – Escopo Léxico em Dart – Curso de FLUTTER/DART

Playlist: Curso Grátis de FLUTTER e DART Completo

Curso de DART

Alcance lexical

Dart é uma linguagem de escopo léxico, o que significa que o escopo das variáveis ​​é determinado estaticamente, simplesmente pelo layout do código. Você pode “seguir as chaves para fora” para ver se uma variável está no escopo.

Aqui está um exemplo de funções aninhadas com variáveis ​​em cada nível de escopo:

bool topLevel = true;

void main ()
  var insideMain = true;

  void myFunction ()
    var insideFunction = true;

    void nestedFunction ()
      var insideNestedFunction = true;

      assert (topLevel);
      assert (insideMain);
      assert (insideFunction);
      assert (insideNestedFunction);

Observe como nestedFunction () pode usar variáveis ​​de todos os níveis, até o nível superior.

Fechamentos lexicais
Um encerramento é um objeto de função que tem acesso a variáveis ​​em seu escopo léxico, mesmo quando a função é usada fora de seu escopo original.

As funções podem fechar as variáveis ​​definidas nos escopos adjacentes. No exemplo a seguir, makeAdder () captura a variável addBy. Onde quer que a função retornada vá, ela se lembra de addBy.

/// Retorna uma função que adiciona [addBy] ao
argumento da /// função.
Função makeAdder (num addBy)
  return (num i) IGUAL MAIOR addBy + i;

void main ()
  // Cria uma função que adiciona 2.
  var add2 = makeAdder (2);

  // Cria uma função que adiciona 4.
  var add4 = makeAdder (4);

  assert (add2 (3) == 5);
  assert (add4 (3) == 7);

Testando funções para igualdade
Veja um exemplo de teste de funções de nível superior, métodos estáticos e métodos de instância para igualdade:

void foo () // Uma função de nível superior

classe A
  barra estática de vazio () // Um ​​método estático
  void baz () // Um ​​método de instância

void main ()
  var x;

  // Comparando funções de nível superior.
  x = foo;
  assert (foo == x);

  // Comparando métodos estáticos.
  x = A.bar;
  assert (A.bar == x);

  // Comparando métodos de instância.
  var v = A (); // Instância # 1 de A
  var w = A (); // Instância # 2 de A
  var y = w;
  x = w.baz;

  // Estes encerramentos referem-se à mesma instância (# 2),
  // então eles são iguais.
  assert (y.baz == x);

  // Estes encerramentos referem-se a diferentes instâncias,
  // então eles são desiguais.
  assert (v.baz! = w.baz);

Valores de retorno
Todas as funções retornam um valor. Se nenhum valor de retorno for especificado, a instrução retornará nulo; é implicitamente anexado ao corpo da função.

foo () {}

assert (foo () == null);