Escopo da Função e Escopo do Bloco
Quando você declara uma variável dentro de uma função, a variável é vinculada dentro da função e você não pode acessá-la fora da função. var
é a palavra-chave para definir uma variável para acessibilidade da função-escopo.
Agora, você pode perguntar, se ela dá um erro mesmo que você use let
ou const
, por que apenas var
está associada ao escopo da função? A coisa é, let
e const
são usados para definir o escopo do bloco, e antes do ES6, o JavaScript não tinha escopo de bloco ou let
e const
.
Um escopo de bloco é a área dentro de
if
,switch
condições oufor
ewhile
loops. Simplificando , sempre que você vê {curly brackets}, é um bloco.
Vejamos um exemplo:
Agora pode esperar que nenhum dos comandos de log funcione mas como pode ver não é o caso com var, variáveis definidas com var dentro de if
, switch
condições ou for
e while
loops podem ser acessados globalmente e fazem parte do escopo global e por isso é melhor usar let
e const
com eles.
Escopo léxico
Finalmente, atingimos o verdadeiro propósito deste post. Bem, eu poderia ter pulado a longa discussão sobre escopo, mas pessoalmente, eu não acho que você possa entender o escopo léxico sem conhecer os componentes chave que giram em torno dele.
Again, um ponto a ser lembrado: Javascript tem escopo léxico com funções escopo.
Em palavras simples, significa que o escopo infantil tem acesso às variáveis definidas no escopo dos pais. Por exemplo, se eu fosse definir uma função e declarar uma variável dentro dela e dentro da mesma função, definir outra função, então eu deveria ser capaz de usar essa variável dentro da função interna por causa do escopo léxico. Vejamos um exemplo:
Pode ser visto pelo exemplo, as variáveis declaradas em outerFunction()
são acessadas por innerfunction()
, isto é o escopo léxico.
O escopo das variáveis é definido pela sua posição no código. Para resolver variáveis, o JavaScript começa no escopo mais interno e busca até encontrar a variável que estava procurando. No exemplo acima, Javascript primeiro procura por variáveis dentro de innerFunction()
e quando não a encontra, vai para fora i.e. outerFunction()
Oscopo léxicoéxico é melhor porque podemos facilmente descobrir o valor de uma variável a partir do código, enquanto no escopo dinâmico, o significado de uma variável pode mudar em tempo de execução, o que a torna complexa de entender.
Então, nós entendemos com sucesso o que é o escopo léxico, agora vamos olhar para os fechamentos onde o escopo léxico é realmente usado.