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.

Author: mricci, 2013-06-26

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.

 98
Author: mplungjan,
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.

 9
Author: jfriend00,
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.
  1. 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.
  2. 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 Instrukcja if i zdefiniuj ją w instrukcji if.
  3. 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).
  4. 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 .
 8
Author: Aadit M Shah,
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.

 0
Author: Joseph Myers,
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