Dlaczego zmienne podnoszące JavaScript?

99

Dlaczego zmienne podnoszące JavaScript?

Jaki był powód, dla którego projektanci zdecydowali się wdrożyć podnoszenie? Czy są jakieś inne popularne języki, które to robią?

Proszę podać odpowiednie linki do dokumentacji i / lub zapisów.

Xlaudius
źródło
7
Podejrzewam, że w tym miejscu jest to historyczne i poważnie wątpię, czy pierwotnie było to coś innego niż „łatwość implementacji”.
Dave Newton,
4
Szczerze mówiąc, zapytaj Brendana Eicha, wydaje się być dość wrażliwy.
Felix Kling
23
Dlaczego to pytanie nie jest konstruktywne?
Francisc
19
@Francisc zapraszamy do przepełnienie stosu, gdzie wszystko można zapytać o to ruchomy divw jQuery
Xlaudius
21
To naprawdę ważne pytanie. Powinno było pozwolić. To nie była przynęta na ogień. Podnoszenie jest jednym z podstawowych elementów zrozumienia, jak działa JavaScript, a „dlaczego” jest uzasadnionym pytaniem, które jest poruszane w większości podręczników dotyczących tego języka. NIE jest w porządku, że ludzie z przepełnieniem stosu STALE tupią na takie pytania ludzi.
bearvarine

Odpowiedzi:

56

Jak wyjaśnia Stoyan Stefanov w książce „JavaScript Patterns”, podnoszenie jest wynikiem implementacji interpretera JavaScript.

Interpretacja kodu JS wykonana w dwóch przebiegach. Podczas pierwszego przebiegu interpreter przetwarza deklaracje zmiennych i funkcji.

Drugi przebieg to rzeczywisty krok wykonania kodu. Interpreter przetwarza wyrażenia funkcyjne i niezadeklarowane zmienne.

Zatem do opisania takiego zachowania możemy użyć pojęcia „podnoszenia”.

lxgreen
źródło
15
Ja osobiście naprawdę nie lubią słowa „podnoszenia”. Daje fałszywą reprezentację, że deklaracje zmiennych i funkcji są magicznie podnoszone na szczyt bieżącego zakresu, podczas gdy w rzeczywistości interpreter JS, jak wspomniałeś, skanuje kod źródłowy w poszukiwaniu powiązań, a następnie wykonuje kod.
contactmatt
Teraz zrozumiałem, dlaczego JS jest najbardziej niezrozumiałym językiem, nie widziałem tego w żadnym tutorialu. I pomylił się z podnoszeniem (i przepływem interepreterów).
Swapnil Patwa
20
Uh, to tak naprawdę nie wyjaśnia uzasadnienia. Interpreter jednoprzebiegowy (który nie prowadziłby do podnoszenia) byłby znacznie prostszy - dlaczego więc projektanci zdecydowali się na dwa przejścia?
Bergi
1
Nie wyjaśnia to, dlaczego w szczególności zmienne są podnoszone. Funkcje mają sens, zmienne nie (w większości przypadków) - uważam, że to błąd.
Josh M.,
1
Josh M. To jest tak obszernie określone, nie sądzę, żeby to był "błąd" ... (zgadzam się, że ta odpowiedź tak naprawdę nie odpowiada na rozumowanie)
Jonas Wilms
14

Twórca JS Brendan Eich powiedział kiedyś (na Twitterze) :

„Podnoszenie var było zatem [] niezamierzoną konsekwencją podnoszenia funkcji, bez zakresu blokowego, [i] JS jako pilna praca w 1995 roku”.

Wyjaśnił również, że…

"Funkcja podnoszenia pozwala na dekompozycję programu z góry na dół, 'let rec' za darmo, wywołaj przed deklaracją; var hoisting oznaczony razem."

Brendan Eich

Czy są jakieś inne popularne języki, które to robią?

Nie znam żadnych innych popularnych języków, które w ten sam sposób podnoszą zmienne. Myślę, że nawet ActionScript - kolejna implementacja ECMAScript używana w programowaniu Flash - nie zaimplementowała podnoszenia. Było to źródłem nieporozumień i frustracji dla programistów znających inne języki, którzy uczą się JavaScript.

gfullam
źródło
3
Dawanie +1, ponieważ jest to jedyna odpowiedź, która próbuje bezpośrednio odpowiedzieć na pytanie.
Damon
2
Dziękuję za tę odpowiedź. W pełni zgadzam się z @Damon!
kodowaniebryan
1
Innym popularnym językiem, który ma zmienne podnoszenie, jest Python: stackoverflow.com/q/63337235/2326961
Maggyero
1
Błędny. Python NIE ma zmiennego podnoszenia. Zobacz: discuss.python.org/t/ ...
Victor Yan,
2

Dzieje się tak, ponieważ interpreter JavaScript interpretuje kod w dwóch cyklach.

  1. Uzupełnianie / kompilacja kodu:
  2. Wykonanie kodu:

W 1 cyklu wszystkie deklaracje zmiennych i funkcji są brane do górnej części zakresu funkcji jest nakaz. To pomaga w tworzeniu variableObjectsdla execution contextfunkcji nawet zanim będzie za realizację.

W drugiej fazie przypisania wartości, instrukcje kodu i wywołania funkcji są wykonywane wiersz po wierszu w oczekiwany sposób.

Tutaj masz trochę bardziej szczegółowe informacje .

To daje lepszy obraz wokół zachowań wokół let, consti classdeklaracji, również pierwszeństwa wynika między zmiennych i funkcji.

Jaspreet Singh
źródło
1
Czy sugerujesz, że jest to konsekwencja wyboru projektu? Jeśli tak, powinieneś to wyraźnie zaznaczyć w swojej odpowiedzi. Ale czytając odpowiedź Brendana Eicha, mogła to być cecha poszukiwana, zależała od tego, jak zinterpretujesz ostatnie zdanie. Podsumowując, nadal nie wiem, dlaczego na pewno
Bombinosh