Atribuindo "deixe" um valor em Javascript

8

Eu estava brincando nas ferramentas do Chrome e tentei o seguinte código:

let = 1;
let x = 2;

console.log(let); // 1
console.log(x); // 2

O código acima não funcionará se eu substituir "let" por "var".

Estou assumindo que let = 1é o mesmo que var let = 1. Em caso afirmativo, não deve let x = 2ser traduzido 1 x = 2e, portanto, deve ser um erro?

Raisen
fonte
1
leté keyword, você não deve nomear (ou tentar nomear) variáveis ​​que. Estou surpreso que o Chrome até deixe (lol) você fazer isso.
Isick

Respostas:

10

Estou assumindo que let = 1é o mesmo quevar let = 1

Declara uma variável, mas não é a mesma. A maior diferença aqui é que ao omitir uma declaração como var, letou const, você está declarando esta variável globalmente * (supondo que você não está definindo uma variável previamente declarada). Isso é conhecido como um global implícito - um notório cheiro de código .

* Na maioria dos casos, "global" se refere ao windowobjeto, mas esse nem sempre é o caso. Por exemplo, o Node.js possui seu próprio globalobjeto de espaço para nome que se refere ao módulo atual.


Nesse caso, não deve let x = 2ser traduzido para1 x = 2 e, portanto, deve ser um erro?

No. let = 1não substitui a funcionalidade nativa da letdeclaração / palavra-chave. Você acabou de criar uma variável global com o mesmo nome. ( Talvez seja necessário dizer, mas não faça isso! )


E você não perguntou isso especificamente, mas vale a pena abordar:

Por que tenho permissão para fazer, let = 1mas nãovar = 1 ?

var é um palavra-chave reservada .

leté uma palavra-chave reservada futura , o que significa que atualmente ela está reservada apenas no modo estrito . Isso, se você estiver tentando escrever um código que resista ao teste do tempo, é melhor não usá-lo letcomo identificador. Como a MDN afirma no artigo vinculado, eu imagino que será uma palavra reservada mais cedo ou mais tarde.

Tyler Roper
fonte
Ótima explicação, muito obrigado! Eu não estava ciente dos diferentes tipos de palavras-chave.
Raisen
5

Compatibilidade com versões anteriores. leté relativamente novo, portanto, não é uma palavra-chave reservada para não quebrar scripts antigos usando-a como um nome de variável. É por isso que você pode usar letcomo um nome de variável e não var.

Estou assumindo que let = 1 é o mesmo que var let = 1.

Não. É igual a someothername = 1e cria uma variável global implícita que é muito ruim.

Jonas Wilms
fonte