Abaixo tenho duas linhas de código simples e agradáveis. Mas posso garantir que isso irá confundir muito (como porque você ignorou o princípio do sublinhado do JS) ou confortá-lo.
Mas possui conceitos de conhecimento totalmente carregados conforme abaixo
Minha declaração contraditória
como var, const e let também içar suas propriedades, mas elas estão em zonas diferentes.
hoisting Def (versão simples/leiga)
Agora é hora de nos aprofundarmos em como Js compila e executa nosso código de 2 linhas
Em JavaScript, a maneira como o compilador e o mecanismo lidam com declarações e atribuições de variáveis pode ter nuances, especialmente ao lidar com let e var.
Vamos analisar o processo das perspectivas do compilador e da execução para o código fornecido:
name = 'ashu'; let name;
neste ponto estou deixando claro que quando escrevemos o código javascript, o primeiro analisador e compilador compila nosso código e então ele entra na fase de execução.
Perspectiva do compilador
Primeira linha: nome = 'ashu';
Durante a fase de compilação,
o mecanismo JavaScript analisa o código e cria os escopos necessários.
A atribuição name = 'ashu';
será anotado, mas neste estágio, o mecanismo não executa o código; apenas registra a existência de uma atribuição a uma variável chamada nome.
Se o nome não foi declarado antes, o compilador o trata como uma atribuição a uma variável global (nome var no escopo global), uma vez que as declarações var são içadas e acessíveis globalmente.
Segunda linha: deixe o nome;
Quando o compilador encontra o nome let; declaração, ele reconhece que nome deve ter escopo de bloco.
O compilador coloca o nome na Zona Morta Temporal (TDZ) para o escopo ao qual pertence,
o que significa que reconhece a existência do nome, mas o marca como não inicializado.
A declaração let não é içada da mesma maneira que var.
Em vez disso, ele cria uma ligação no escopo e a inicializa somente quando a declaração é executada.
Perspectiva de execução
Primeira linha: nome = 'ashu';
Quando o mecanismo JavaScript executa a atribuição name = 'ashu';,
verifica a existência de name no escopo atual. Como name é declarado com let, mas está na TDZ (Zona Morta Temporal), qualquer tentativa de acessá-lo antes da declaração let ser inicializada resultará em um ReferenceError.
Portanto, neste ponto, name está na TDZ e a atribuição name = 'ashu'; resulta em um ReferenceError.
Segunda linha: deixe o nome;
Esta linha inicializa a variável name dentro do escopo do bloco.
Após este ponto, nome não estará mais na TDZ e poderá ser acessado ou atribuído sem erros.
Agora dica bônus
diferença entre undeclarar vs indefinido vs não inicializado;
undeclare :- a variável ainda não foi declarada.
indefinido :- Variável declarada mas não inicializada;
não inicializado :- variável definida, mas seu valor virá na parte posterior.
Ex: - resultado const = multiplicarBy2(5);
até que o valor de retorno da função seja atribuído ao resultado, até esse ponto ele estaria em uma zona não inicializada.
fato interessante:-
Você conhece a zona morta temporal inicialmente decorada para Const, mas mais tarde eles foram adotados em **Let**
Referência:-
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3