"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Noções básicas sobre içamento em JavaScript: um guia abrangente

Noções básicas sobre içamento em JavaScript: um guia abrangente

Publicado em 2024-11-05
Navegar:870

Understanding Hoisting in JavaScript: A Comprehensive Guide

Içando em JavaScript

Içar é um comportamento no qual declarações de variáveis ​​e funções são movidas (ou "içadas") para o topo de seu escopo contendo (tanto o escopo global quanto o escopo da função) antes o código é executado. Isso significa que você pode usar variáveis ​​e funções antes que elas sejam realmente declaradas no código.

Içando em Variáveis

var

  • Variáveis ​​declaradas com var são elevadas ao topo de seu escopo, mas seus valores não são inicializados até o ponto do código onde a atribuição ocorre.
console.log(x); // undefined
var x = 5;
console.log(x); // 5

deixe e const

  • Variáveis ​​declaradas com let e const também são içadas, mas são colocadas em uma "zona morta temporal" até que suas declarações sejam alcançadas. Acessá-los antes de serem declarados resultará em um ReferenceError.
console.log(y); // ReferenceError: Cannot access 'y' before initialization
let y = 10;

// block scope
{
  let x = 5;
}

console.log(x); // ReferenceError: x is not defined

Içamento em Funções

Função Tradicional

  • As declarações de função são totalmente içadas, o que significa que tanto a declaração quanto o corpo da função são movidos para o topo do escopo. Isso permite chamar uma função antes de sua declaração no código.
sayHello(); // "Hello!"
function sayHello() {
  console.log("Hello!");
}
  • Em contraste, expressões de função (onde uma função é atribuída a uma variável) são apenas içadas como variáveis, portanto, chamá-las antes de a variável ser inicializada resultará em indefinido ou em TypeError.
greet(); // TypeError: greet is not a function
var greet = function () {
  console.log("Hi!");
};

greet(); // ReferenceError: Cannot access 'one' before initialization
let greet = function () {
  console.log("Hi!");
};

Função de seta

  • Em contraste, expressões de função (onde uma função é atribuída a uma variável) são apenas içadas como variáveis, portanto, chamá-las antes de a variável ser inicializada resultará em indefinido ou em TypeError.
greet(); // TypeError: greet is not a function
var greet = () => {
  console.log("Hi!");
};

greet(); // ReferenceError: Cannot access 'one' before initialization
let greet = function () {
  console.log("Hi!");
};

Zona Morta Temporal (TDZ)

A zona morta temporal (TDZ) existe para variáveis ​​declaradas usando let e const porque o JavaScript foi projetado para impedir que você acesse essas variáveis ​​antes que elas sejam declaradas e inicializadas.

Por que var e let, const se comportam de maneira diferente no içamento

  • É por causa da evolução histórica do JavaScript.
  • Inicialmente, o JavaScript foi projetado para usuários que não são desenvolvedores, e o principal uso do JavaScript era adicionar pequenos elementos interativos à página da web.
  • Então var suporta apenas escopo funcional. Também naquela época, não havia escopo de bloco.
  • Mas na evolução posterior do JavaScript, tornou-se mais complicado trabalhar com var e corrigir bugs.
  • Portanto, para tornar o JavaScript competitivo com outras linguagens modernas, mais recursos foram adicionados, como let, const, funções de seta, métodos ES6, etc.

Por que var não é atualizado como let e const

  • É por causa da compatibilidade com versões anteriores.
  • Naquela época, o JavaScript era amplamente utilizado por muitas empresas, portanto, atualizar ou fazer alterações nos recursos existentes levaria à quebra da base de código.
  • Portanto, recursos modernos foram adicionados individualmente.

Perguntas comuns da entrevista

  • O que é içar em JavaScript?
  • O que é içado em JavaScript e o que não é?
  • Qual é a diferença entre var, let e const em relação ao içamento?
  • O que é a zona morta temporal (TDZ) em JavaScript?
  • Você pode explicar o içamento com declarações de função versus expressões de função?
  • O que é içamento em módulos ES6?
  • Por que devemos evitar depender de içamento em código do mundo real?

Resumo

  • Elevar é o comportamento padrão em JavaScript onde declarações de variáveis ​​e funções são movidas para o topo de seus respectivos escopos durante a fase de compilação.
  • O içamento funciona apenas para variáveis ​​declaradas com var e funções tradicionais, não para funções let, const e arrow.
  • Apenas a declaração da função é içada, então as funções tradicionais funcionam, mas se a função for atribuída a uma variável, ela não poderá ser chamada até que seja definida.
  • A razão pela qual as funções var e tradicionais são içadas, mas as funções let, const e arrow não, é porque no estágio inicial, o JavaScript era usado principalmente para pequenas interações de UI.
  • Mas mais tarde, como o JavaScript foi amplamente utilizado para a construção de aplicações pelas empresas, tornou-se mais difícil corrigir bugs apenas com escopo global.
  • Portanto, em atualizações futuras, questões mais seguras foram abordadas.
  • Além disso, a atualização de recursos existentes quebraria as bases de código, portanto, novos recursos foram adicionados separadamente.
Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/nishanthank/understanding-hoisting-in-javascript-a-comprehensive-guide-5bic?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

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