Variáveis e escopos do ES6

Publicação: | Tags: JavaScript, Node.js

Variáveis e escopos do ES6

Desde o início do JavaScript sempre foi muito comum declarar variáveis ou constantes usando a keyword var. É importante saber que ao declarar variáveis usando var elas serão function-scoped, ou seja, são visíveis dentro de um escopo de função e também dentro de funções filhas deste escopo. Isso pode ser um problema pois este comportamento pode se tornar bem confuso. Por exemplo:

var msg = 'Olá ...';
function helloMsg(string) {
  if (string) {
    var msg = `Olá ${string}`;
    return msg;
  }
  return msg;
}
helloMsg();

Ao olhar a simples lógica você diria: ah, essa é fácil, vai retornar a string 'Olá ...', pois é, para nossa surpresa ao executar o comando helloMsg(); foi retornado undefined. Isso se deve pelo fato de que o escopo vale para função helloMsg() como um todo - mesmo sem esta linha ter sido executada por conta do if (string). Para você entender, é como se o interpretador JavaScript tivesse lido o código todo como o seguinte:

var msg = 'Olá ...';
function helloMsg(string) {
  // Internamente o interpretador vai criar uma varíavel undefined no escopo da function
  var msg; 
  if (string) {
    var msg = `Olá ${string}`;
    return msg;
  }
  return msg;
}
helloMsg();

Escopo de bloco com let e const

No ES6 existem duas novas formas para declarar variáveis, são let e const. Diferente de var, essas variáveis são block-scoped, ou seja, elas são visíveis dentro de um escopo de bloco e também dentro de blocos filhos deste escopo. Este comportamento se aproxima de outras linguagens de programação, como por exemplo Ruby.

Usando let

let funciona como var, mas como escopo de bloco em vez de escopo de função. Perceba no código abaixo que a variável tmp só existe dentro do bloco do if:

function nomeEditora(string) {
  if (string) {
    let tmp = string;
  }
  console.log(tmp);
  // ReferenceError: tmp is not defined
  return string;
}

Usando const

const funciona similar a let, com a diferença que você já precisa iniciar com um valor fixo na sua declaração, e este valor não poderá ser trocado depois, ou seja, as constantes são imutáveis (immutable variables). Exemplo:

const nome;
// SyntaxError: Missing initializer in const declaration

const nome = 'John Connor';
nome = 'Sarah Connor';
// TypeError: Assignment to constant variable.

Quando usar const ou let

Recomendamos que use sempre let ou const, e evite var. Quando você souber que o valor da varíavel não irá mudar, ou seja, a constante nunca poderá receber outro valor ou ser usada com operações usando ++ ou --, use const. É importante saber que o objeto e array que for uma constante pode se alterar em seus atributos internos sem problemas, exemplo:

const usuario = {};
usuario.nome = 'John Connor';
console.log(usuario.nome); // John Connor

const scores = [];
scores.push(1);
scores.push(3);
scores.push(2);
console.log(scores); // [1, 3, 2]

Ao usar a função for também prefira usá-la com const. O compilador do ES6 associará um valor imutável a constante para cada loop. Lembrando que o valor da constante x dentro do bloco do for não poderá ser alterada:

for (const x of ['a', 'b']) {
  console.log(x);
}

Entretando, use let quando o valor inicial de uma varíavel irá mudar. Por exemplo:

let counter = 0;
// initial value
counter++;
// change

let obj = {};
// initial value
obj = { foo: 123 };
// change

Se você seguir esses conselhos, você não terá mais a keyword var em seus futuros projetos JavaScript.

Recentemente lancei o ebook JavaScript Awesome Tips (Br version) com diversas dicas sobre JavaScript, vale a pena a leitura!

Compartilhe este post