Executando verificação de segurança...
2

O que é Hoisting em Javascript?

Esse artigo é uma tradução livre de What is Hoisting in Javascript?, por Sunil Sandhu.


Uma das muitas peculiaridades do Javascript é algo conhecido como hoisting.

Se você começou a desenvolver recentemente com Javascript, é bem provável que você ainda não esteja escrevendo seu código perfeitamente. Então, por causa disso, é altamente provável que seu hoisting não esteja perfeito também.😉

O que é hoisting?

Basicamente, quando o Javascript compila todo seu código, todas as declarações de variáveis usando var são hoistiadas(abrasilerei)/levadas ao topo de suas funções/escopo local (se declaradas dentro de uma função), ou ao topo do escopo global (se declaradas fora de uma função) independentemente de onde a declaração foi feita. Isto é o que queremos dizer com “hoisting”.

As declarações de funções também são hoistiadas, mas elas irão para a parte mais alta do escopo, por isso ficará acima de todas as declarações de variáveis.

Chega de conversinha, vamos ver alguns exemplos básicos para demonstrar o impacto do hoisting.

Se escrevermos o seguinte código:

console.log(meuNome);
var meuNome= 'Bob';

Pop quiz! O que o comando console.logmostrará?

  1. Uncaught ReferenceError: meuNome is not defined

  2. Bob

  3. undefined

A terceira opção é realmente a resposta correta.

Como falei anteriormente, as variáveis são movidas pro topo de seus escopos
quando seu Javascript compila em tempo de execução ( que — se excluirmos o NodeJS — de uma forma bem básica é quando sua página está carregando). Entretanto, uma coisa importante a notar é que a única coisa que é movida para o topo são as declarações de variáveis, não o valor real delas.

Para clarear as ideias, se tivermos um pedaço de código, e na linha 10 tivermos um var name = 'Sunil', quando o Javascript for compilado, var name será movido ao topo de seu escopo, enquanto name = 'Sunil' permanecerá na linha 10 (ou possivelmente na linha 11 se var name for levada para a linha 1).

Com isso em mente, vamos olhar pro código que coloquei anteriormente, mas vamos ver como o Javascript irá devolver a saída em tempo de execução:

var meuNome;
console.log(meuNome);
meuNome= ‘Sunil’;

É por isso que o console.log devolverá undefined, pois ele reconhece que a variável meuNome existe, porém ela não teve um valor inserido até a terceira linha.

Também mencionamos brevemente anteriormente que funções também são hoistiadas (levadas)para o topo (logo acima, onde as declarações de variáveis ​​são hoistiadas).

Então se olharmos para o código abaixo:

function hey() {
    console.log('hey ' + name);
};
hey();
var name = 'Sunil';

A função hey() retornará undefined mesmo assim, pois o interpretador do JavaScript compilará o código em tempo de execução para o seguinte:

function hey() {
    console.log('hey ' + name);
};
var name;
hey();
name = 'Sunil';

Então, no momento em que a função é chamada ela sabe que uma variável chamada name existe, mas a variável não possui um valor atribuído. Existem algumas variantes para isso que ocorrem ao usar expressões variáveis (variable expressions) de IIFE (clique aqui se você quiser saber mais), mas tentar obter um controle mental de tudo isso de uma vez não é o ideal, então eu irei deixá-lo pesquisar o hoisting a respeito de function expressions e IIFE’s.

Tendo falado isso, tudo que mencionei anteriormente deve ajudá-lo a entender como o hoisting funciona.

O conceito de hoisting é a razão pela qual você pode, às vezes, se deparar com o código de outras pessoas, no qual as variáveis são declaradas logo no topo e, em seguida, recebem valores posteriormente. Essas pessoas estão simplesmente tentando fazer com que seu código se assemelhe ao modo como o interpretador irá compilá-lo, a fim de ajudá-lo a minimizar possíveis erros.

Se você gostou desse artigos, envie muitos claps e se inscreva em minha publicação Javascript In Plain English.

Carregando publicação patrocinada...
2

Esse artigo me fez lembrar quando eu comecei a desenvolver com javascipt a uns 5 anos atrás. Hoisting é um assunto bem interessante e saber disso nos ajuda a evitar alguns erros. por exemplo chamar uma variavel antes da sua definição. Porque fazendo isso vai retornar underfined. Com o ES6 a palavra resevada var foi trocada por const ou let elas não são influenciada pelo hoiting. Parabéns, pelo tempo de traduzir o material e contribuir com mais esse conteúdo de qualidade.

1

Só uma correção no ES6 o var ainda existe, o const e o let foram adicionados com conceitos diferentes do var.

Em geral:

  • prefira o const ao invés do let
  • prefira o let ao invés do var
  • quase nunca use o var
1

Obrigado por deixar mais claro o uso do var. Não é recomedado usar, é preferido usar o let e const.
Quem tem uma pegada de código funcional usa mais o const em vez do let.