Renê Soares programação e aleatóriedades

Hoisting, const e let

Nos meus estudo do JavaScript estava tendo dificuldade em entender os comportamentos exclusivos das variáveis, funções e comportamento da linguagem, literalmente dando um nó na cabeça. Decidi usar como guia de estudos o material do CodeCast, vendo os vídeos do Vinicius Reis da série Domine this pois do material em vídeo que eu pesquisei foi o melhor.

Afinal o que é hoisting?

Basicamente o javascript “elava” (hoisting) todas as variáveis até o topo do contexto de execução. É por esse motivo que quando executamos o js (forma carinhosa de chamar o javascript) reconhece as variáveis antes mesmo de ser declarada. Achou meio confuso? No começo do meu estudo também fiquei, mas o exemplo abaixo vai ajudar a ilustrar.

console.log(pessoa);
// veja que não tinha iniciado a variável 'pessoa' dando um undefined

var pessoa = { nome: "Renê", sobrenome: "Soares" };
// criado a variável 'pessoa' como um objeto

console.log(pessoa);
// imprimindo o objeto da variável 'pessoa'

Veja a primeira linha do exemplo, perceba que usei o console.log(pessoa) sem iniciar a variável. Se fosse na maioria das linguagens daria logo uma grande erro na tela porém no nosso querido js simplesmente da um undefined. Logo na linha 4 iniciei a variável pessoa como um objeto e na linha 7 uso novamente o console.log(pessoa) e imprime o objeto.

Vamos ver o let?

Segundo a página do mozilla falando sobre let: “let permite que você declare variáveis limitando seu escopo no bloco, instrução, ou em uma expressão na qual ela é usada.” Acredito que o exemplo abaixo vai melhorar muito o entendimento.

var residencia1 = 5;
var residencia2 = 10;

if (residencia1 === 5) {
    let residencia1 = 4; // O escopo é dentro do bloco if
    let residencia3 = 41; // O escopo é dentro do bloco if
    var residencia2 = 1; // O escopo é dentro da função

    console.log(residencia1); // 4
    console.log(residencia2); // 1
    console.log(residencia3); // 41
}

console.log(residencia1); // 5
console.log(residencia2); // 1
console.log(residencia3); // vai dar erro

Veja as linhas 5, 6 e 7 onde usamos o let e sobrescrevemos a variável residencia2, perceba que enquanto os console.logs dentro do if foram sobrescritas. Perceba que na linha 14 a variável voltou para seu antigo valor, a variável da linha 15 que foi sobrescrita na linha 7 e na linha 16 deu erro pois a variável residencia3 só existe dentro do bloco.

Chegamos ao const

Ao declarar const cria-se uma variável onde seu valor é fixo porém não significa que o valor do mesmo seja imutável. Essa variável pode pertencer tanto ao escopo global quanto ao bloco onde foi declarada. Outra coisa importante é que toda constante tem que ser iniciada, ou seja, ter um valor atribuído. Acredito que um exemplo possa ilustrar melhor.

const MY_UF = 'PR';
console.log('Meu estado é ' + MY_UF);

MY_UF = 'SE';

const MY_UF = 'RS';
var MY_UF = 'SP';
let MY_UF = 'BA';

const estados = {'uf' : 'PR'};

estados.uf = 'SE';

Antes de começar a explicar o código acima é importante ressaltar que as variáveis declaradas com const podem ser em caixa alta ou baixa, porém é uma convenção usar apenas em caixa alta, certo?

Na linha 1 declaramos a variável MY_UF foi declarada e atribuído um valor, perceba que da linha 5 até a linha 11 tentei mudar seu valor e em todos eles tivemos erro. Na linha 13 eu declarei uma variável como constante e recebendo um objeto, só que na linha 15 eu consigo mudar o seu valor, isso é possível pois a variável estados está apontando para um ponteiro na memória e como ela é uma constante eu não consigo mudar porém o objeto está apontando para um ponteiro de memória diferente e esse não está protegido por const e por isso consigo mudar.

Conclusão

Esse foi o segundo post de uma série sobre JavaScript o primeiro foi Entendendo Scopes, os códigos de exemplo estão no meu github caso queiram baixar. Espero que tenham gostado e qualquer dúvida, crítica ou sugestão basta colocar nos comentário.

comments powered by Disqus