Perché JavaScript issa le variabili?


94

Perché JavaScript issa le variabili?

Qual era la logica dei progettisti quando hanno deciso di implementare il sollevamento? Esistono altre lingue popolari che lo fanno?

Fornire collegamenti pertinenti alla documentazione e / o ai record.


7
Sospetto che a questo punto sia storico e dubito seriamente che fosse qualcosa di diverso dalla "facilità di implementazione" originariamente.
Dave Newton,

4
Onestamente, chiedi a Brendan Eich, sembra essere abbastanza reattivo.
Felix Kling

22
In che modo questa domanda non è costruttiva?
Francisc

18
@Francisc benvenuto in Stack Overflow, dove tutto ciò che puoi chiedere è spostare un divin jQuery
Xlaudius

20
Questa è una domanda davvero importante. Avrebbe dovuto essere permesso. Non era un'esca infuocata. Il sollevamento è uno degli elementi fondamentali per comprendere come funziona JavaScript e il "perché" è una domanda legittima che viene affrontata nella maggior parte dei testi trattati sulla lingua. NON è OK che le persone di Stack Overflow calpestino COSTANTEMENTE le domande delle persone in questo modo.
bearvarine

Risposte:


55

Come spiega Stoyan Stefanov nel libro "JavaScript Patterns", il sollevamento è il risultato dell'implementazione dell'interprete JavaScript.

L'interpretazione del codice JS eseguita in due passaggi. Durante il primo passaggio, l'interprete elabora le dichiarazioni di variabili e funzioni.

Il secondo passaggio è l'effettivo passaggio di esecuzione del codice. L'interprete elabora espressioni di funzioni e variabili non dichiarate.

Quindi, possiamo usare il concetto di "sollevamento" per descrivere tale comportamento.


15
Io personalmente davvero non mi piace la parola "sollevamento". Dà la falsa rappresentazione che le dichiarazioni di variabili e funzioni vengono magicamente sollevate in cima allo scope corrente, quando in realtà, l'interprete JS, come hai detto, scansiona il codice sorgente per i collegamenti e quindi esegue il codice.
contattare il

Ora ho capito perché JS è il linguaggio più frainteso, non l'ho visto in nessun tutorial. E mi sono confuso con il sollevamento (e il flusso dell'interprete).
Swapnil Patwa

17
Uh, questo non spiega davvero la logica. Un interprete a passaggio singolo (che non avrebbe portato al sollevamento) sarebbe stato molto più semplice, quindi perché i progettisti hanno optato per due passaggi?
Bergi

1
Questo non spiega perché le variabili, in particolare, siano sollevate. Le funzioni hanno senso, le variabili no (nella maggior parte dei casi) - credo che sia un bug.
Josh M.

Josh M. Questo è così ampiamente specificato, non penso che questo sia un "bug" ... (Sono d'accordo che questa risposta non risponde davvero al ragionamento però)
Jonas Wilms

10

Il creatore di JS Brendan Eich una volta ha detto (su Twitter) :

"Il var hoisting era quindi [una] conseguenza non intenzionale del sollevamento funzionale, nessun ambito di blocco, [e] JS come lavoro urgente del 1995".

Ha anche spiegato che ...

"la funzione hoisting consente la scomposizione del programma dall'alto verso il basso, 'let rec' gratuitamente, chiama prima di dichiarare; var hoisting taggato."

Brendan Eich

Esistono altre lingue popolari che lo fanno?

Non conosco altri linguaggi popolari che elevano le variabili allo stesso modo. Penso che anche ActionScript, un'altra implementazione di ECMAScript utilizzata nello sviluppo di Flash, non abbia implementato il sollevamento. Questo è stato fonte di confusione e frustrazione per gli sviluppatori che hanno familiarità con altri linguaggi che stanno imparando JavaScript.

AGGIORNAMENTO: Dai commenti, Python ha un comportamento di sollevamento delle variabili simile .


2
Dare un +1 in quanto questa è l'unica risposta che tenta di affrontare direttamente la domanda.
Damon

1
Grazie per questa risposta. Sono pienamente d'accordo con @Damon!
codingbryan

1
Un'altra lingua popolare che ha sollevamento variabile è Python: stackoverflow.com/q/63337235/2326961
Maggyero

2

Questo perché l'interprete javascript interpreta il codice in due cicli.

  1. Completamento / compilazione del codice:
  2. Esecuzione del codice:

Nel primo ciclo tutte le dichiarazioni di variabili e funzioni vengono portate all'inizio dell'ambito della funzione in cui è in esecuzione. Questo aiuta a creare variableObjectsuna execution contextfunzione anche prima della sua esecuzione.

Nella seconda fase, le assegnazioni di valori, le istruzioni di codice e le chiamate di funzione avvengono riga per riga nel modo previsto.

Hai una lettura un po 'più dettagliata qui.

Vi darà un quadro più preciso intorno comportamento intorno let, conste classdichiarazioni, anche la precedenza segue tra il variabile e funzioni.


1
Stai insinuando che sia una conseguenza di una scelta di design? Se è così, dovresti dichiararlo chiaramente nella tua risposta. Ma leggendo la risposta di Brendan Eich, potrebbe essere stata una caratteristica ricercata, dipende da come interpreti l'ultima frase. In
conclusione,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.