Let é o novo Var



Quando aprendemos uma linguagem de programação, vários conceitos básicos aparecem, como declarar variáveis, e são tão simples que podemos começar a usá-los sem nenhum conhecimento de seu funcionamento.

Sei o que você pensou: "Por que você está perdendo tempo escrevendo para nós sobre isso?"

Porque acho que vale a pena gastar alguns minutos para entender melhor esses elementos, qual é o significado deles e como devemos usá-los. Isso ajudará a evitar alguns erros comuns e a escrever melhor o código.

Neste artigo, focaremos em como armazenar dados em JavaScript.

Var


"Era uma vez em uma galáxia distante ..." a única opção para definir variáveis ​​em JavaScript era usar a palavra-chave var, o que era suficiente para manipular os dados no código. Mas com a introdução do padrão ES6, algumas das peculiaridades e fraquezas do antigo JS se tornaram bastante óbvias:

  1. Escopo: a palavra-chave var permite definir variáveis ​​apenas no escopo global e local (ou no escopo de uma função). Não importa quantos blocos de código aninhados você tenha, existem apenas essas duas possibilidades.
  2. Constantes: se você deseja definir algo que não será alterado durante a execução do código, poderá confiar apenas no senso comum dos desenvolvedores. Podemos usar algumas convenções úteis para esclarecer o significado (por exemplo, letras maiúsculas), mas não há nada para garantir que o significado não mude.
  3. Substituindo Variáveis: Você pode repetir a declaração da mesma variável quantas vezes quiser (no mesmo escopo), e isso é um pouco confuso se você deseja manter as variáveis ​​exclusivas.

Definições


Antes de começar com o material técnico, vamos apresentar algumas definições gerais:

Uma variável é um "contêiner" no qual dados reutilizáveis ​​são armazenados (muito triviais).

Identificadores são nomes de variáveis ​​(também muito triviais).

Um bloco é um pedaço de código separado por um par de chaves ( ccskrf ), por exemplo: if, for, function e. etc.

Escopo , determina a visibilidade das variáveis ​​dentro do código. Se você tiver alguma dúvida, pergunte-se: "Onde está minha variável visível no código?"
NOTA Por favor, não confunda o escopo com o contexto de execução , que é diferente.

** Contexto (ou contexto de execução) ** é o ambiente no qual o código JavaScript é executado. Para simplificar, podemos dizer que o contexto é o objeto ao qual o código pertence e esta é a palavra-chave que se refere a ele. Então, pergunte-se: "A que objeto isso se refere?"

Agora, suponha que nosso desenvolvedor seja muito apaixonado por Guerra nas Estrelas (o que é bom), mas desconfie de novos padrões como o ES6 (o que é ruim), embora ele já exista há algum tempo. Portanto, ele prefere escrever seu código no antigo estilo ES5, e ficará assim:

console.log("I am a %s", jedi); var jedi = "Ani"; //   jedi    // =>  undefined function useTheForce(comeToTheDarkSide) { var jedi = "Obi-Wan Kenobi"; var jedi = "Anakin Skywalker"; if (comeToTheDarkSide) { var jedi = "Darth Vader"; console.log("I am %s", jedi); // => I am Darth Vader } console.log("I am %s", jedi); //  Darth Vader } useTheForce(true); console.log("I am %s", jedi); // => Ani 

Como você pode ver, existem três blocos de código (incluindo global), mas apenas dois escopos. Isso ocorre porque o código entre parênteses não cria um escopo. O console emitirá "Eu sou Darth Vader" duas vezes e depois "Eu sou Ani" globalmente.

Observe também que a mesma variável é declarada duas vezes seguidas dentro da função e, em seguida, novamente na instrução if. Isso significa que temos a declaração da mesma variável no mesmo escopo três vezes, o que gera uma exceção.

Por último, mas não menos importante, a saída do primeiro log é: imprimimos o valor de nossa variável antes de defini-la. Isso é completamente legal com var e é chamado de "içamento".

A "subida" pressupõe que as variáveis ​​e funções declaradas sejam fisicamente movidas para o início do seu código. Tecnicamente, há declarações de variáveis ​​e funções que são armazenadas na memória no estágio de compilação, mas permanecem no código exatamente onde você as escreveu. A importância fundamental de um aumento é que ele permite que você use funções antes de declará-las em seu código.

Você pode ler sobre isso aqui .

No nosso exemplo, a declaração da variável "jedi" é colocada na memória e inicializada com o valor padrão (indefinido).

Vamos


No momento, nosso desenvolvedor entende que o ES6 não é tão ruim e decide dar uma chance:

 console.log("I am a %s", jedi); let jedi = "Ani"; //   jedi    // => Uncaught ReferenceError:     "jedi"   function useTheForce(comeToTheDarkSide) { let jedi = "Obi-Wan Kenobi"; let jedi = "Anakin Skywalker"; // => Uncaught SyntaxError:  ''   if (comeToTheDarkSide) { var jedi = "Darth Vader"; console.log("I am %s", jedi); // =>  Darth Vader } console.log("I am %s", jedi); //  Anakim Skywalker } useTheForce(true); console.log("I am %s", jedi); // =>  Ani 

Mas ele logo percebe que não pode simplesmente alterar a palavra-chave var, pois é necessário fazer algumas correções:

O aumento não funciona da mesma maneira: uma variável é colocada em um estado chamado Zona Mortal Temporal * * e não é inicializada até que a definição seja avaliada. No nosso exemplo, ele lança um erro: erro de referência.

é proibida a reatribuição , a definição de uma variável no escopo deve ser única. Ao tentar obter um erro: SyntaxError.

A instrução if é um escopo de bloco válido, portanto, a declaração jedi dentro dela é única.

Agora o código deve ser assim:

 let jedi = "Ani"; console.log("I am a %s", jedi); // print jedi variable before defining it // =>  Ani (  ) : 0 function useTheForce(comeToTheDarkSide) { let jedi = "Obi-Wan Kenobi"; let jedi = "Anakin Skywalker"; if (comeToTheDarkSide) { var jedi = "Darth Vader"; console.log("I am %s", jedi); // =>  Darth Vader } console.log("I am %s", jedi); //  Anakim Skywalker } useTheForce(true); console.log("I am %s", jedi); 

Const


Agora que você sabe tudo sobre o let, será fácil apresentá-lo ao const . Em essência, podemos dizer que const é semelhante a let, mas você não pode reatribuir outro valor. Você também precisa saber que a atribuição é permitida apenas durante declarações const.

 function useTheForce(comeToTheDarkSide) { const jedi = "Yoda"; if (true) { jedi = "Darth Yoda"; console.log("I am %s", jedi); // => TypeError: Assignement to constant variable. } } useTheForce(true); 

Suponha que, em nosso exemplo, "jedi" seja uma constante com o valor "Yoda", se tentarmos alterar o valor dentro da instrução if, isso nos dará um erro TypeError, e isso é compreensível porque o Yoda nunca se unirá ao lado sombrio.

Conclusão


Quando é impossível expressar um conceito em palavras em idiomas, um novo conceito é introduzido para preencher a lacuna. Isso está correto para inglês ( link. ), Italiano, esperanto, ewokese (suponho), etc. Isso é ainda mais verdadeiro para linguagens de programação como JavaScript.

Agora você sabe que pode:

  • Declarar variáveis ​​no escopo do bloco e alocar memória para elas somente ao avaliar o bloco
  • Mantenha as declarações de variáveis ​​exclusivas dentro do escopo, evitando que o desenvolvedor substitua por engano a variável usada em outra parte do código (com um valor diferente)
  • Podemos garantir que a variável armazenada em const não seja alterada a qualquer momento.

Minha última dica é usar const como sua opção padrão. Quando precisar reatribuir uma variável, use ** let ** (como nos loops). E use var quando ... não, você não precisa mais de var, realmente

Obrigado pela atenção.

Perguntas rápidas sobre Javascript

Estou no twitter e vk

Source: https://habr.com/ru/post/pt466559/


All Articles