Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00525 010881 7466224 na godz. na dobę w sumie
Tajniki języka JavaScript. Zakresy i domknięcia - ebook/pdf
Tajniki języka JavaScript. Zakresy i domknięcia - ebook/pdf
Autor: Liczba stron: 112
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-2182-3 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> javascript - programowanie
Porównaj ceny (książka, ebook (-20%), audiobook).
Początkujący programista może zacząć szybko tworzyć proste aplikacje w JavaScripcie i nabrać złudnego przekonania o swoich umiejętnościach. Jednak ten, kto chce osiągnąć prawdziwą biegłość w tym języku, musi opanować trudniejsze zagadnienia, na przykład asynchroniczność czy techniki związane z wydajnością. Choć nie jest to ani proste, ani oczywiste, trzeba też zrozumieć wewnętrzne mechanizmy rządzące JS. Dopiero wiedza na tym poziomie pozwoli na zdobycie umiejętności profesjonalisty.

Niniejsza książka jest drugą częścią serii w całości poświęconej językowi JavaScript. Jest przeznaczona dla osób, które używają JS w swojej pracy, ale postanowiły włożyć trochę wysiłku w to, aby bardzo dokładnie rozumieć, dlaczego i w jaki sposób działa ten język. Omówiono w niej bardzo istotne koncepcje JS: zakresy i domknięcia. Poza ogólnymi informacjami szczegółowo opisano m.in. zakresy leksykalne, zakresy funkcji i bloku, mechanizm hostingu i zakresy domknięcia. Co najważniejsze, przedstawiono materiał w sposób przystępny, zwięzły i klarowny, ale nieodmiennie na bardzo wysokim poziomie.

Dzięki tej książce:

Dowiedz się, w jaki sposób działa Twój kod JS!

Znajdź podobne książki

Darmowy fragment publikacji:

Tytuł oryginału: You Don t Know JS: Scope Closures Tłumaczenie: Robert Górczyński ISBN: 978-83-283-2177-9 © 2016 Helion S.A. Authorized Polish translation of the English edition You Don t Know JS: Scope Closures ISBN 9781449335588 © 2014 Getify Solutions, Inc. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/tjszak Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treści Przedmowa ........................................................................................ 5 Wprowadzenie ................................................................................... 7 1. Czym jest zakres? .............................................................................. 13 13 16 21 24 25 Teoria kompilatora Poznajemy zakres Zakres zagnieżdżony Błędy Podsumowanie 2. Zakres leksykalny ............................................................................. 27 27 30 36 Czas lexingu Oszukanie zakresu leksykalnego Podsumowanie 3. Zakres funkcji kontra zakres bloku .................................................... 39 39 40 44 49 57 Zakres na podstawie funkcji Ukrycie w zwykłym zakresie Funkcja jako zakres Blok jako zakres Podsumowanie 3 Poleć książkęKup książkę 4. Hoisting ............................................................................................59 59 60 63 65 Jajko czy kura? Powrót kompilatora Najpierw funkcje Podsumowanie 5. Zakres domknięcia ............................................................................67 67 68 72 74 77 85 Wyjaśnienie Sedno sprawy Teraz mogę zobaczyć Pętle i domknięcia Moduły Podsumowanie A Zakres dynamiczny ...........................................................................87 B Skrypty typu polyfill dla zakresu bloku ..............................................91 92 93 95 Traceur Niejawne kontra wyraźne bloki Wydajność C Leksykalne this .................................................................................97 D Podziękowania ............................................................................... 101 Skorowidz ...................................................................................... 105 4 (cid:95) Spis treści Poleć książkęKup książkę ROZDZIAŁ 4. Hoisting W tym momencie powinieneś już dość dobrze znać ideę zakresu i wiedzieć, jak zmienne są dołączane na różnych poziomach zakresu w zależności od sposobu ich zadeklarowania. W przypadku zakresu zarówno funkcji, jak i bloku stosuje się dokładnie te same reguły — każda zmienna zadeklarowana wewnątrz zakresu zostaje do niego dołączona. Jednak istnieje drobny szczegół dotyczący działania mechanizmu dołączania do zakresu, gdy deklaracje pojawiają się w różnych miejscach zakresu. I tym właśnie szczegółem zajmiemy się w rozdziale. Jajko czy kura? Można by uznać, że cały kod w programie JavaScript jest interpretowany wiersz po wierszu, od początku do końca w trakcie wykonywania programu. Wprawdzie pod pewnymi względami to prawda, ale pewna część przedstawionego założenia może doprowadzić do nieprawidłowych wniosków dotyczących programu. Spójrz na poniższy fragment kodu: a = 2; var a; console.log( a ); Jakiego wyniku oczekujesz po wykonaniu polecenia console.log(..)? Wielu programistów oczekuje wartości undefined, ponieważ polecenie var a znajduje się po operacji przypisania a = 2; naturalne wydaje się założenie, 59 Poleć książkęKup książkę że zmienna a będzie ponownie zdefiniowana i tym samym otrzyma wartość domyślną undefined. Jednak dane wyjściowe ostatniego polecenia w omawianym fragmencie kodu to 2. Spójrz na kolejny fragment kodu: console.log( a ); var a = 2; Być może sądzisz, że skoro w poprzednim fragmencie kodu mieliśmy do czy- nienia z wyszukiwaniem nieco innym niż od początku do końca kodu, to wyni- kiem działania powyższego również będzie wyświetlenie wartości 2. Część pro- gramistów może pomyśleć jeszcze inaczej: ponieważ zmienna a została użyta wcześniej, nowy fragment kodu spowoduje zgłoszenie błędu typu Reference (cid:180)Error. Niestety, oba założenia są nieprawidłowe. Wynikiem działania powyższego fragmentu kodu jest wyświetlenie wartości undefined. Powstaje pytanie: co się tutaj dzieje? Wygląda na to, że mamy tu odwieczny problem „jajko czy kura”. Co było pierwsze: deklaracja („jajko”) czy przypi- sanie („kura”)? Powrót kompilatora Aby odpowiedzieć na powyższe pytanie, musimy powrócić do rozdziału 1. i przedstawionej tam analizy dotyczącej kompilatorów. Przypomnij sobie, że silnik w rzeczywistości przeprowadza kompilację kodu JavaScript przed jego interpretacją. Jedną z faz etapu kompilacji jest wyszukanie i powiązanie wszystkich deklaracji z odpowiednimi zakresami. W rozdziale 2. dowiedziałeś się, że stanowi to serce zakresu leksykalnego. Dlatego też najlepsze podejście polega na przyjęciu założenia, że wszelkie deklara- cje zarówno zmiennych, jak i funkcji są przetwarzane jako pierwsze, zanim nastąpi wykonanie jakiegokolwiek innego fragmentu kodu. Kiedy widzisz polecenie var a = 2;, prawdopodobnie uważasz je za pojedyncze polecenie. Jednak JavaScript traktuje je jako dwa polecenia: var a; i a = 2;. Pierwsze z tych poleceń, deklaracja, jest przetwarzane w trakcie fazy kompilacji. Z kolei drugie, przypisanie, jest pozostawione na miejscu i czeka na fazę wykonania. 60 (cid:95) Rozdział 4. Hoisting Poleć książkęKup książkę Dlatego też pierwszy fragment kodu będzie potraktowany tak, jakby przed- stawiał się następująco: var a; a = 2; console.log( a ); Część pierwsza będzie wykonana w trakcie kompilacji, natomiast część druga w fazie wykonywania programu. Z kolei drugi z omawianych fragmentów kodu będzie potraktowany, jakby przedstawiał się następująco: var a; console.log( a ); a = 2; Dlatego też jedną z możliwości związaną z omawianym procesem, taką nieco w przenośni, jest założenie, że deklaracje zmiennych i funkcji są „przenoszo- ne” z miejsca ich występowania na początek kodu. W ten sposób docieramy do określenia hoisting. Innymi słowy, jajko (deklaracja) było wcześniej niż kura (przypisanie). Przeniesienie na początek kodu dotyczy jedynie deklaracji, nato- miast wszelka logika odpowiedzialna za właściwą operację przy- pisania lub wykonania innego kodu jest pozostawiona na dotych- czasowym miejscu. Jeżeli hoisting mógłby zmieniać kolejność wykonywanej logiki kodu, to mogłoby to mieć trudne do przewidzenia skutki dla programu. foo(); function foo() { console.log( a ); // Wartość undefined var a = 2; } Deklaracja funkcji foo(..) (w omawianym przykładzie zawiera wartość rze- czywistej funkcji) zostaje poddana hoistingowi, aby jej wywołanie w wierszu pierwszym mogło być wykonane. Powrót kompilatora (cid:95) 61 Poleć książkęKup książkę Trzeba koniecznie wspomnieć, że hoisting odbywa się dla poszczególnych za- kresów. Wcześniejsze przykłady były uproszczone i uwzględniały jedynie za- kres globalny, natomiast w przypadku omawianej teraz funkcji foo(..) mamy do czynienia z przeniesieniem deklaracji var a na początek funkcji (oczywiście nie na początek samego programu). Dlatego też program znacznie poprawniej można przedstawić w następujący sposób: function foo() { var a; console.log( a ); // Wartość undefined a = 2; } foo(); Jak mogłeś zobaczyć, deklaracje funkcji również podlegają hoistingowi. To jednak nie dotyczy wyrażeń funkcji. foo(); // Błąd typu TypeError, a nie ReferenceError! var foo = function bar() { // … }; Identyfikator zmiennej foo zostaje przeniesiony i dołączony do zakresu nad- rzędnego (globalnego) programu. Dlatego też próba wykonania funkcji foo() nie kończy się błędem typu ReferenceError. Jednak foo nie ma jeszcze przypi- sanej wartości (byłaby, gdyby zamiast wyrażenia funkcji została użyta deklara- cja zwykłej funkcji). Próba wywołania foo() kończy się otrzymaniem wartości un- defined, co oznacza niedozwoloną operację i zgłoszenie błędu typu TypeError. Przypomnij sobie, że nawet w przypadku nazwanego wyrażenia funkcji nazwa identyfikatora pozostaje niedostępna w zakresie nadrzędnym: foo(); // Błąd TypeError bar(); // Błąd ReferenceError var foo = function bar() { // … }; 62 (cid:95) Rozdział 4. Hoisting Poleć książkęKup książkę Powyższy fragment kodu będzie (wraz z hoistingiem) zinterpretowany w na- stępujący sposób: var foo; foo(); // Błąd TypeError bar(); // Błąd ReferenceError foo = function() { var bar = ...self... // … } Najpierw funkcje Hoistingowi podlegają deklaracje zarówno zmiennych, jak i funkcji. Jednak sub- telny szczegół (który może ujawnić się w kodzie wraz z wieloma „powielonymi” deklaracjami) to fakt, że hoistingowi najpierw podlegają funkcje, a dopiero później zmienne. Spójrz na poniższy fragment kodu: foo(); // 1 var foo; function foo() { console.log( 1 ); } foo = function() { console.log( 2 ); }; Wyświetlona zostanie wartość 1 zamiast 2! Przedstawiony powyżej fragment jest przez silnik interpretowany w następujący sposób: function foo() { console.log( 1 ); } foo(); // 1 foo = function() { console.log( 2 ); }; Najpierw funkcje (cid:95) 63 Poleć książkęKup książkę Zwróć uwagę na powieloną (i tym samym zignorowaną) deklarację var foo, nawet pomimo faktu jej występowania przed deklaracją function foo()..., po- nieważ deklaracje funkcji podlegają hoistingowi przed zwykłymi zmiennymi. Podczas gdy wiele powielających się deklaracji var jest po prostu ignorowanych, każda kolejna deklaracja funkcji nadpisuje poprzednią. foo(); // 3 function foo() { console.log( 1 ); } var foo = function() { console.log( 2 ); }; function foo() { console.log( 3 ); } Wprawdzie to wszystko może wydawać się jedynie interesującym rozważaniem akademickim, jednak wyraźnie podkreśla fakt, że powielone definicje w tym sa- mym zakresie naprawdę są kiepskim rozwiązaniem i bardzo często prowadzą do dezorientujących wyników. Deklaracje funkcji pojawiające się wewnątrz zwykłych bloków są zwykle przeno- szone do zakresu nadrzędnego, a nie traktowane warunkowo, jak mogłoby wynikać z poniższego fragmentu kodu: foo(); // b var a = true; if (a) { function foo() { console.log( a ); } } else { function foo() { console.log( b ); } } Jednak trzeba pamiętać, że to zachowanie nie należy do niezawodnych i może ulec zmianie w kolejnych wydaniach języka JavaScript. Dlatego też prawdopo- dobnie najlepszym rozwiązaniem jest unikanie deklarowania funkcji w blokach. 64 (cid:95) Rozdział 4. Hoisting Poleć książkęKup książkę Podsumowanie Kuszące może być potraktowanie polecenia var a = 2; jako pojedynczego, ale silnik JavaScript nie postrzega go w taki sposób. Zamiast tego widzi dwa oddziel- ne polecenia, var a i a = 2. Pierwsze jest wykonywane w trakcie fazy kompilacji, natomiast drugie w fazie właściwego wykonywania programu. Prowadzi to do następującego wniosku: wszystkie deklaracje w zakresie, nie- zależnie od miejsca ich występowania, są przetwarzane przed rozpoczęciem wykonywania kodu. Można powiedzieć, że deklaracje (zmiennych i funkcji) są „przenoszone” na początek ich zakresów, a ten proces jest określany mianem hoistingu. Hoistingowi podlegają same deklaracje, natomiast operacje przypisania, nawet przypisania wyrażeń funkcji — już nie. Zachowaj ostrożność i unikaj powielonych deklaracji, zwłaszcza ich mieszania między zwykłymi deklaracjami var i deklaracjami funkcji — w przeciwnym razie może to być niebezpieczne! Podsumowanie (cid:95) 65 Poleć książkęKup książkę 66 (cid:95) Rozdział 4. Hoisting Poleć książkęKup książkę Skorowidz jako zakres, 44 setTimeout(), 72 strzałki, arrow function, 97 funkcje anonimowe, 46 nazwane, 46 strzałek, 100 typu IIFE, 73 G globalne przestrzenie nazw, 43 gruba strzałka, 97 A abstract syntax tree, 14 anonimowe wyrażenie funkcji, 46 AST, 14 B blok jako zakres, 49 bloki niejawne, 93 wyraźne, 93 błąd ReferenceError, 40 błędy, 24 C celowa różnica w działaniu, 100 hoisting, 59, 61 H I IIFE, 47, 73 iteracja, 77 pętli, 55 J język Kompilatora, 17 D domknięcie, 67, 69, 74, 79 F funkcja, 63 bar(), 69 CoolModule(), 79 eval(), 31, 35 105 Poleć książkęKup książkę R S RHS, 18 silnik, 20 JavaScript, 25 skrypty typu polyfill, 91 słowo kluczowe function, 97 let, 52 specyfikacja ES3, 58 ES6, 58 struktura try-catch, 58 T teoria kompilatora, 13 this, 97 token, 14 tokenizacja, 14, 27 U ukrycie w zwykłym zakresie, 40 unikanie kolizji, 42 usuwanie nieużytków, 54 użycie domknięcia, 72 this, 98 W wiązanie this, 99 wydajność, 35, 95 wyszukiwanie, 29 wywoływane wyrażenia funkcji, 47 wzorzec IIFE, 73 kolizje, 42 kompilator, 13, 60 konstrukcja const, 57 try-catch, 51 with, 33, 51 leksykalne this, 97 lexing, 14, 27 LHS, 18 K L M mechanizm this, 97 usuwania nieużytków, 54 metafora, 22 moduły, 44, 77 nowoczesne, 81 przyszłe, 83 nieużytki, 54 N O operacja wyszukiwania, 29 optymalizacja, 36 oszukanie zakresu leksykalnego, 30 P pętla, 74 for, 55 let, 55 projekt Traceur, 92 przestrzenie nazw, 43 106 (cid:95) Skorowidz Poleć książkęKup książkę Z zagnieżdżone zakresy, 28 zakres, 13, 16, 20 bloku, 39, 77, 91 domknięcia, 67 dynamiczny, 87 funkcji, 39 leksykalny, 27 na podstawie funkcji, 39 zagnieżdżony, 21 zarządzanie modułami, 44 Skorowidz (cid:95) 107 Poleć książkęKup książkę 108 (cid:95) Skorowidz Poleć książkęKup książkę
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Tajniki języka JavaScript. Zakresy i domknięcia
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: