Diferenças entre var, let, e const na linguagem Javascript
Published: 2022-04-03 15:42:58

No post anterior eu expliquei sobre o conceito de escopos na linguagem Javascript. Neste trarei breves notas sobre a diferença na forma como declaramos variáveis no Javascript. 

Qual é a diferença de declarar uma variável como *var*, *let* ou *const.*

Quem já programa na linguagem a um bom tempo, a regra era iniciar uma variável com *var.* Porém, após o ES2015 (ES6), novas formar surgiram, quais sejam: *let* e *const.* 

## Variáveis declaradas com *var*

Um aspecto importante quando utilizamos *var* é que ele tem escopo global e local ([aqui](https://pliniorb.hashnode.dev/diferencas-entre-escopos-no-javascript)). Como vimos quando estava falando de escopo, é possível acessar uma variável inicializada fora do escopo que a esta invocando. 

Olha o exemplo:

```jsx
var nome = "Heliot"

function pequi() {
    console.log(nome) // Heliot
}

pequi()
```

No exemplo acima, quando chamamos a função *pequi()*, ela consegue acessar o conteúdo da variável *nome* e exibir o seu conteúdo. Isto se dá pela razão de possuir o escopo global, ou seja, ela pode ser utilizada em várias partes do nosso código.

Impera anotar acerca da utilização de *var* é o *hoisting* realizado pela linguagem. Contudo, este assunto eu tratarei no próximo texto. 

Outro aspecto importante da utilização de *var* é possibilidade de alterar o conteúdo da variável. 

```jsx
let nome = "Heliot"

function pequi() {
    nome = "Larissa"
    console.log(nome) // Larissa
}

pequi()
```

Quando chamamos a função *pequi()*, alteramos o valor da variável sem nenhum erro. Dado o seu escopo global de acessibilidade de leitura e modificação.  

## Variáveis declaradas com *let*

*Let* está sendo a forma preferida de declarar variáveis. Se diferencia de *var* em razão do seu escopo ser de bloco e não global. 

O que é um bloco? Um bloco é um trecho de código iniciado e fechado por chaves “{}”. O que estiver nesse contexto é um bloco especifico. 

Quando iniciamos uma variável com *let* em um bloco, sua acessibilidade se é limitada a este bloco. Vejamos um exemplo. 

```jsx
let n = 4;

if (n > 3) {
    let ola = "Olá para todos!";
    console.log(ola); // Olá para todos!
}
    
console.log(ola) // ReferenceError: ola is not defined
```

Veja que quando tentamos tentar acessar o conteúdo de *ola* fora do bloco é retornado um erro de referência. 

Isso não acontece quando utilizamos *var*. 

Olha outro exemplo. 

```jsx
let n = 4;

if (n > 3) {
    var ola = "Olá para todos!";
    
    console.log(ola); // Olá para todos!
    }
    
console.log(ola) // Olá para todos!
```

Já nesse exemplo foi possível acessar o conteúdo de *ola*. Isto se dá pelo *hoisting,* que explicarei no próximo texto. 

Está limitação de acessibilidade é a principal diferença entre declara com *var* ou com *let.* 

Quando a possibilidade de sofrer alterações, *let* permite que sejam realizadas. Veja:

```jsx
let n = 4;

if (n > 3) {
    n = 0
}
console.log(n) // 0
```

## Variáveis declaradas com *const*

A caraterística marcante da utilização de *const* é a sua imutabilidade. Quando declaramos variável com *const* ela não poderá ser alterar ou redeclarada. 

```jsx
const a = 1
a = 2 // TypeError: Assignment to constant variable.
console.log(a)
```

No exemplo acima, quando tentamos modificar o valor de *a*, é retornado um erro de tipo, que impede a alteração da variável já declarada.

## Conclusão

Neste texto eu trouxe breves notas da diferença entre a utilização de *var*, *let* e *const.* Sendo essas últimas introduzidas pelo ES2015 (ES6). 

Conhecer suas diferenças é importante na escrita diárias dos nossos códigos, para que sejam mais eficientes e com menos chances de provocarem *bugs.*