Quais são as diferenças entre as variáveis criadas usando `let`, `var` ou `const`?
Topics
JAVASCRIPT
Edit on GitHub
Variáveis declaradas usando a palavra-chave var
têm escopo à função na qual foram criadas, ou se criadas fora de qualquer função, ao objeto global. let
and const
são block scoped, o que significa que eles só são acessíveis dentro do conjunto mais próximo de chaves (função, bloco if-else ou for-loop).
function foo() {// Todas as variáveis são acessíveis dentro de funções.var bar = 'bar';let baz = 'baz';const qux = 'qux';console.log(bar); // barconsole.log(baz); // bazconsole.log(qux); // qux}console.log(bar); // ReferenceError: bar não é o consoleconsole.log(baz); // ReferenceError: baz não é definidoconsole.log(qux); // ReferenceError: qux não é definido
if (true) {var bar = 'bar';let baz = 'baz';const qux = 'qux';}// var variáveis declaradas são acessíveis em qualquer lugar do escopo da função.console.log(bar); // bar// let e const defined variáveis não são acessíveis fora do bloco no qual eles foram definidos.console.log(baz); // Referência: baz não está definidoconsole.log(qux); // Referência: qux não está definido
'var' permite que as variáveis sejam hoisted, o que significa que elas podem ser referenciadas no código antes de serem declaradas. 'let' e 'const' não permitirão isso, em vez disso, será lançado um erro.
console.log(foo); // undefinedvar foo = 'foo';console.log(baz); // ReferenceError: não pôde acessar o console da declaração léxico 'baz' antes da inicializaçãolet baz = 'baz';console.log(bar); // ReferenceError: não é possível acessar a declaração léxico 'bar' antes da inicializaçãoconst bar = 'bar';
Redeclarar uma variável com var
não causará um erro, mas let
e const
irá.
var foo = 'foo';var foo = 'bar';console.log(foo); // "bar"let baz = 'baz';let baz = 'qux'; // Uncaught SyntaxError: Identifier 'baz' já foi declarado
let
e const
diferem que let
permite reatribuir o valor da variável enquanto const
não.
// Tudo bem.let foo = 'foo';foo = 'bar';// Isso causa uma exceção.const baz = 'baz';baz = 'qux';
Notas
- Como a maioria dos navegadores suportam
let
econst
atualmente, usarvar
não é mais recomendado. Se você precisa dar suporte a navegadores mais antigos, escreva seu código usandolet
e use um transpiler como o Babel para compilar seu código para uma sintaxe mais antiga.