Por que o JavaScript eleva as variáveis?

99

Por que o JavaScript eleva as variáveis?

Qual foi o raciocínio dos designers quando decidiram implementar o içamento? Existem outras linguagens populares que fazem isso?

Forneça links relevantes para documentação e / ou registros.

Xlaudius
fonte
7
Suspeito que a esta altura seja histórico e duvido seriamente que tenha sido qualquer coisa diferente de "facilidade de implementação" originalmente.
Dave Newton
4
Honestamente, pergunte a Brendan Eich, ele parece ser bastante responsivo.
Felix Kling
23
Como essa pergunta não é construtiva?
Francisc de
19
@Francisc bem-vindo ao Stack Overflow, onde tudo que você pode perguntar é sobre como mover um divem jQuery
Xlaudius
21
Esta é uma questão muito importante. Deveria ter sido permitido. Não era isca de fogo. O içamento é um dos principais elementos para entender como funciona o JavaScript, e o "por quê" é uma questão legítima que é abordada na maioria dos tratamentos da linguagem em livros didáticos. NÃO está certo que as pessoas do Stack Overflow pisem CONSTANTESMENTE nas perguntas das pessoas como esta.
bearvarine

Respostas:

56

Como Stoyan Stefanov explica no livro "Padrões JavaScript", a elevação é resultado da implementação do interpretador JavaScript.

A interpretação do código JS realizada em duas passagens. Durante a primeira passagem, o interpretador processa declarações de variáveis ​​e funções.

A segunda passagem é a etapa real de execução do código. O intérprete processa expressões de função e variáveis ​​não declaradas.

Assim, podemos usar o conceito de "içamento" para descrever tal comportamento.

lxgreen
fonte
15
Eu, pessoalmente, realmente não gosto da palavra "elevação". Ele dá a falsa representação de que as declarações de variáveis ​​e funções são magicamente içadas ao topo do escopo atual, quando na realidade, o interpretador JS, como você mencionou, verifica o código-fonte para as ligações e, em seguida, executa o código.
contactmatt
Agora eu entendi porque a linguagem JS é mais mal compreendida, não vi isso em nenhum tutorial. E se confundiu com içamento (e fluxo de intérprete).
Swapnil Patwa
19
Uh, isso realmente não explica o motivo. Um intérprete de passagem única (que não levaria ao içamento) teria sido muito mais simples - então por que os projetistas optaram por duas passagens?
Bergi
1
Isso não explica por que as variáveis, especificamente, são içadas. Funções fazem sentido, variáveis ​​não (na maioria dos casos) - acredito que seja um bug.
Josh M.
1
Josh M. Isso é tão extensivamente especificado, não acho que seja um "bug" ... (concordo que essa resposta não responde realmente ao raciocínio)
Jonas Wilms
14

O criador do JS, Brendan Eich , disse uma vez (no Twitter) :

"Var içamento foi, portanto, [uma] consequência não intencional de função içamento, sem escopo de bloco, [e] JS como um trabalho urgente de 1995."

Ele também explicou que ...

"função de içamento permite decomposição de programa de cima para baixo, 'deixe rec' de graça, ligue antes de declarar; var içada junto."

Brendan Eich

Existem outras linguagens populares que fazem isso?

Não conheço nenhuma outra linguagem popular que erga variáveis ​​da mesma maneira. Acho que até o ActionScript - outra implementação do ECMAScript usada no desenvolvimento do Flash - não implementou içamento. Isso tem sido uma fonte de confusão e frustração para desenvolvedores familiarizados com outras linguagens que estão aprendendo JavaScript.

gfullam
fonte
3
Dar um +1, pois esta é a única resposta que tenta responder diretamente à pergunta.
Damon
2
Obrigado por esta resposta. Eu concordo totalmente com @Damon!
codingbryan de
1
Outra linguagem popular que tem elevação variável é o Python: stackoverflow.com/q/63337235/2326961
Maggyero
1
Incorreta. Python NÃO tem levantamento variável. Veja: discuss.python.org/t/…
Victor Yan
2

Isso ocorre porque o interpretador javascript interpreta o código em dois ciclos.

  1. Completar / compilar código:
  2. Execução do código:

No 1º ciclo todas as variáveis e funções declarações são levados para cima do escopo da função que está sendo executada. Isso ajuda na criação variableObjectsde execution contextda função mesmo antes de sua execução.

Na 2ª fase, as atribuições de valor, instruções de código e chamadas de função ocorrem linha por linha da maneira esperada.

Você leu um pouco mais detalhadamente aqui.

Ele lhe dará uma melhor imagem em torno em torno do comportamento let, conste classdeclarações, também a precedência que segue entre variável e funções.

Jaspreet Singh
fonte
1
Você está insinuando que é uma consequência de uma escolha de design? Em caso afirmativo, você deve declarar isso claramente em sua resposta. Mas lendo a resposta de Brendan Eich, pode ter sido um recurso desejado, depende de como você interpreta a última frase. Resumindo, ainda não sei por quê
Bombinosh