JavaScript - Instytut Informatyki
Transkrypt
JavaScript - Instytut Informatyki
JavaScript Wstęp do podstaw elementów Wprowadzenie ► Historia ► Netscape (LiveScript, 1995) ► JavaScript (Netscape), JScript (Microsoft), ActionScript (Adobe) ► przekazany do ECMA (European Computer Manufacturers Association) celem standaryzacji ► ECMAScript 1996 r. ► Aktualna wersja to ECMAScript 6 (2015 r.) ► Zastosowania ► najczęściej uruchamiany po stronie klienta (w przeglądarce) ► może być uruchamiany po stronie serwera (node.js) ► można także pisać „zwykłe” aplikacje © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 2 Zmienne typowane dynamicznie ► Ta sama zmienna może raz przechowywać liczby, a innym razem łańcuchy znaków ► Skąd wiedzieć jaki jest aktualny typ zmiennej? duck typing Jeżeli coś wygląda jak kaczka, pływa jak kaczka i kwacze jak kaczka to prawdopodobnie jest kaczką Sprawdzamy na etapie wykonania, czy obiekt ma odpowiednie metody © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 3 Komentarze, operatory ► Komentarz ► Blokowy /* To jest Komentarz */ ► Liniowy var a = 5; // to jest komentarz ► Operatory ► porównanie wartości == (np. true dla 1=="1") ► porównanie wartości i typu === (np. false dla 1==="1") © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 4 Zmienne, funkcje ► Zmienne var x = 10; // nie ma typu ► Funkcje – dwie metody deklaracji function isOK1(obj) { … } var isOK2 = function(obj) { … } ► Wywołanie funkcji – różne parametry lub ich brak isOK(100); isOK(); isOK("aa"); © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 5 Tablice ► Deklaracja var samochody = ["AUDI", "BMW"]; for (s in samochody) { // for (var i=0; i < samochody.length; i++) { … } var x = new Array(); x[0] x[1] x[2] x[3] ► = = = = 2008; "FIAT"; {model: "126S"} function(stawka) {return stawka/100;}; Dostęp do elementów console.log(x[0]); console.log(x[1]); console.log(x[2].model); console.log(x[3](150)); © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 6 Obiekty (1) ► Obiekty to kontenery nazwanych wartości (ang. properties) ► Tworzenie obiektów var osoba = new Object(); osoba.imie = "Rysiu"; osoba.obliczWiek = function(aktualnaData) { return …; }; // lub (wersja object literal) var osoba = { imie: "Rysiu", obliczWiek: function(aktualnaData) { return …; } } // lub (wersja z konstruktorem obiektowym) function osoba(im) { // osoba to konstruktor this.imie = im; } var rysiek = new osoba("Rysiu"); © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 7 Obiekty (2) ► Dostęp do pól console.log(osoba.imie); console.log(osoba.obliczWiek(new Date())); //lub console.log(osoba.imie); console.log(osoba.obliczWiek(new Date())); ► Usuwanie pól delete osoba.imie; delete osoba["imie"]; ► Wbudowane konstruktory, m.in.: new new new new ► Object(); String(); Number(); Date(); W praktyce lepiej unikać używania operatora new (i stosować tzw. prymitywy) – bardziej wydajne © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 8 Prototypy ► Każdy obiekt ma prototyp ► Z prototypu dziedziczone są pola i metody function osoba(im) { // prototyp – konstruktor obiektowy this.imie = im; this.obliczWiek() {return …}; } ► Dodawanie pól i metod do prototypu ► zmiana definicji albo ► wykorzystanie słówka prototype osoba.prototype.wzrost = 190; © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 9 Zasięg zmiennych ► Zmienne w JavaScript – także obiekty i funkcje ► Zasięg (scope) to zmienne, obiekty i funkcje, do których mamy dostęp ► Rodzaje zasięgu ► lokalny – zmienne w funkcjach, dostęp tylko z tych funkcji, niszczone wraz z funkcją Uwaga: zmienne niezadeklarowane w funkcjach, stają się zmiennymi globalnymi! ► globalny – zmienne poza funkcjami, dostęp ze wszystkich skryptów i funkcji, niszczone np. po zamknięciu strony ► Parametry funkcji – zachowują się jak zmienne lokalne w funkcjach © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 10 Zakres widoczności (1) var x = 1; f1(); function f1() { var x = 2; f2(); } function f2() { console.log(x); } var x = 1; f1(); function f1() { console.log(x); f2(); } function f2() { console.log(x); } // wynik 1 //wynik 1 1 © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska var x = 1; f1(); function f1() { console.log(x); var x = 2; console.log(x); f2(); } function f2() { console.log(x); } //wynik undefined 2 1 11 Zakres widoczności (2) var x = 1; f1(); function f1() { x = 2; f2(); } function f2() { console.log(x); } // wynik 2 var x = 1; f1(); function f1() { console.log(x); var x = 2; f2(); } function f2() { console.log(x); } //wynik 1 2 © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 12 Domknięcie ► Chcemy zrobić licznik, który będzie dostępny dla wszystkich, a jednocześnie będzie mógł być zmieniany tylko przez jedną funkcję ► Globalna zmienna nie zapewnia ochrony przed zmianą przez kogokolwiek ► Rozwiązanie: closure ► W JavaScript funkcje mogą być zagnieżdżone ► Funkcje mają dostęp do zakresu „ponad” nimi ► Zagnieżdżone funkcje mogą być dostępne na zewnątrz var increment = (function f1() { var counter = 0; //wykonywane tylko raz! return function () {return counter+=1;} }) (); increment(); increment(); © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 13 Wykorzystanie DOM ► Możliwa nawigacja po drzewie DOM ► Dostęp do ► window – kontekst globalny ► document – drzewo dokumentu getElementById("id_prac_10"); getElementsByTagName("div"); querySelector(".klasa div"); © Paweł Boiński, Instytut Informatyki, Politechnika Poznańska 14