Dlaczego zakres bloków nie został pierwotnie zaimplementowany w JavaScript?
Przeczytałem i odkryłem z własnego doświadczenia, że JavaScript nie ma zakresu bloków. Zakładając, że język został zaprojektowany w ten sposób z jakiegoś powodu, jaki to jest powód?
Rozglądałem się po Google i tutaj, ale posty, które znalazłem po prostu powtarzają, że JS ma zakres funkcji, a nie Zakres blokowania, bez wyjaśnienia dlaczego. Jestem ciekaw, dlaczego tak się dzieje.
4 answers
Konwersja mojego komentarza na odpowiedź
Wybór twórcy: wpisałem Brendana i dostałem następującą odpowiedź :
@mplungjan 10 dni nie pozostawiło czasu na blokowanie zakresu. Również wiele "języków skryptowych"z tej połowy lat 90-tych miało niewiele zakresów i rosło później.
To powiedziawszy, oto kilka istotnych punktów:
Ważne: JavaScript nie ma zakresu bloków. Zmienne wprowadzone w bloku są ograniczone do funkcji zawierającej lub skryptu, a efekty ich ustawienia utrzymują się poza samym blokiem. Innymi słowy, polecenia blokowe nie wprowadzają zakresu. Chociaż bloki" standalone " są poprawną składnią, nie chcesz używać bloków autonomicznych w JavaScript, ponieważ nie robią tego, co myślisz, że robią, jeśli myślisz, że robią coś takiego w C lub Javie.
Możemy sztucznie wprowadzać zakresy poprzez tworzenie nowych funkcji i natychmiastowe ich wywoływanie
let
zmienne deklarowane są , a nie przenoszone na początek bloku. Dlatego odwołanie się do zadeklarowanej zmiennej let
przed przypisaniem jej wartości powoduje wywołanie ReferenceError.
Redeklaracja tej samej zmiennej w tym samym zakresie bloku powoduje błąd składni.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 20:28:39
Nowa odpowiedź od 2015 roku. ES6 posiada zakres blokowy dla definicji zmiennych ze słowem kluczowym let
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-04 15:52:13
Zakres bloku nie został wdrożony z następujących powodów:
-
To sprawia, że język jest łatwiejszy do zaimplementowania. JavaScript został początkowo zaprojektowany jako język do pisania interaktywnych aplikacji internetowych. Stąd musiał być mały i łatwy do wdrożenia.
- zakresy blokowe wprowadzają hit wydajności w dynamicznych językach, takich jak JavaScript. Dzieje się tak, ponieważ gdy próbujesz uzyskać dostęp do jakiejś zmiennej, która nie znajduje się w bieżącym zakresie, JavaScript najpierw sprawdza bieżący zakres, a następnie zakres nadrzędny i tak dalej, dopóki nie znajdzie zmiennej lub nie dotrze do końca. Dlatego wprowadzenie zakresów blokowych bardzo spowolniłoby dostęp zmiennych do pętli i zagnieżdżonych pętli.
- Brak zakresów blokowych ułatwia pisanie programów. Na przykład powiedzmy, że chcesz utworzyć zmienną tylko wtedy, gdy określony warunek jest prawdziwy. W JavaScript wystarczy zadeklarować i zdefiniować zmienną w instrukcji
if
. W językach takich jak C trzeba by zadeklarować zmienną poza Instrukcjaif
i zdefiniuj ją w instrukcjiif
. - Brak zakresów blokowych umożliwia wyciąganie deklaracji. Jest to szczególnie przydatne w przypadku deklaracji funkcji. Na przykład Patrz to skrzypce: http://jsfiddle.net/L6SgM/ (zauważ jednak, że ten przykład nie działa w Firefoksie).
- ponieważ JavaScript obsługuje wyrażenia funkcji pierwszej klasy, nie potrzebujemy zakresów blokowych. Można je symulować za pomocą natychmiast wywołanej funkcji wyrażenia .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-26 05:31:06
Istnieje wiele powodów, ale niektóre przychodzą na myśl, aby pomóc w parsowaniu / debugowaniu kodu, który używa literałów obiektów (które czasami mogą wyglądać jak blok), oraz aby uprościć zbieranie śmieci zmiennych lokalnych.
Mam nadzieję, że obiecane wsparcie (omawiane tutaj, na przykład, http://esdiscuss.org/notes/2012-07-25 ) okazuje się być prawdziwe, ponieważ bardzo wygodne byłoby używanie zmiennych, takich jak i
, które były lokalne tylko dla Pojedynczej Pętli.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-26 04:55:53