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);