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.
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.
div
w jQuery
Odpowiedzi:
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”.
„Podnoszenie var było zatem [] niezamierzoną konsekwencją podnoszenia funkcji, bez zakresu blokowego, [i] JS jako pilna praca w 1995 roku”.
"Funkcja podnoszenia pozwala na dekompozycję programu z góry na dół, 'let rec' za darmo, wywołaj przed deklaracją; var hoisting oznaczony razem."
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.
Dzieje się tak, ponieważ interpreter JavaScript interpretuje kod w dwóch cyklach.
W 1 cyklu wszystkie deklaracje zmiennych i funkcji są brane do górnej części zakresu funkcji jest nakaz. To pomaga w tworzeniu variableObjects
dla execution context
funkcji 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
, const
i class
deklaracji, również pierwszeństwa wynika między zmiennych i funkcji.