Wysłanie formularza na pocztę html5 css3. Układ formularza. Przykładowy układ formularza opinii. Formularz rejestracyjny krok po kroku za pomocą jQuery
JavaScript ma wiele sposobów na zrobienie tego samego. Jest w tym zarówno dobro, jak i zło. Dla początkującego to zdecydowanie źle, ponieważ będzie musiał się nie tylko uczyć duża ilość informacji, ale będzie też więcej miejsc, w których można popełnić potencjalne błędy. Może się to zdarzyć podczas definiowania funkcji.
Istnieje wiele różnych sposobów deklarowania funkcji:
FunkcjaA()(); // deklaracja funkcji var B = function () (); // wyrażenie funkcji var C = (funkcja () ()); // wyrażenie funkcji z operatorem grupującym var D = function foo () (); // nazwane wyrażenie funkcyjne var E = (funkcja () ())(); // samowywołujące wyrażenie funkcji var F = new Function(); // Konstruktor funkcji var G = new function() (); // zdegenerowany przypadek: konstruktor obiektu
Trudno się nie pomylić w takiej obfitości, prawda? Z reguły w Życie codzienne używamy nie więcej niż trzech różne rodzaje deklaracje funkcji i działa świetnie. Jeśli jednak zagłębisz się głębiej, może się okazać, że większość z nas nawet nie podejrzewa, ile sakramentów i pułapek zawiera operacja deklaracji funkcji.
Zgodnie z dokumentacją ECMA składnia definiowania funkcji jest następująca:
Deklaracja funkcji: Identyfikator funkcji (Parametry) ( Treść funkcji ) Wyrażenie funkcji: Identyfikator funkcji (opcjonalnie) (Parametry) ( Treść funkcji )
Chociaż te definicje wyglądają dość podobnie, istnieje duża różnica między deklaracją funkcji a wyrażeniem funkcji. Deklaracja funkcji ( Deklaracja funkcji) jest tworzony przed wykonaniem jakiegokolwiek kodu, podczas gdy wyrażenie funkcji ( Wyrażenie funkcji) zostanie utworzony tylko wtedy, gdy interpreter dotrze do podanego wiersza kodu.
Wyrażenie funkcyjne to deklaracja funkcji w kontekście wyrażenia.
Spójrzmy na kilka przykładów wyrażeń funkcyjnych:
operator przypisania
var a = funkcja()();Jest to klasyczny przykład definiowania wyrażenia funkcji poprzez przypisanie. Operator przypisania oczekuje wyrażenia po prawej stronie, dlatego funkcja staje się częścią wyrażenia.
Przy odrobinie wyobraźni możesz wymyślić następujące przykłady:
Var a = funkcja() ( zwraca 1; )() + 12; // 13 var b = function() ( return 1; ) + ""; // funkcja ()(zwróć 1) var c = funkcja() ( zwróć 1; ) + "" - 1; //NaN
Operator grupujący
Deklarując funkcję, nie możemy jej wykonać od razu, jednak owijając deklarację funkcji w nawiasy, staje się to możliwe. Operator grupujący jest wyrażony w nawiasach iw tym przypadku zamienia deklarację funkcji w wyrażenie funkcyjne. Funkcja foo() ( zwraca 1; ) // niezdefiniowana funkcja foo() ( zwraca 1; )(); // Nieprzechwycony błąd składni: oczekiwano () uruchomienia funkcji strzałki, ale otrzymałem ")" zamiast "=>" (funkcja foo() ( zwróć 1; )()) // 1 (funkcja foo() ( zwróć 1; ) )() // jeden
Nie ma zasadniczej różnicy między trzecią a czwartą opcją, ponieważ w pierwszym przypadku wykonujemy wyrażenie, które definiuje i natychmiast wykonuje funkcję, a w drugim przypadku wykonywane jest wyrażenie, które definiuje funkcję, która następnie zostanie wykonana.
operator przecinka
Operator przecinka oblicza wartość każdego ze swoich operandów (od lewej do prawej) i zwraca wartość ostatniego operandu.0, funkcja() ( zwraca 1; )(); // jeden
Operatory (+, -, !, ~, nieważne)
+funkcja() ( zwraca fałsz; )(); // 0 -funkcja() ( zwraca fałsz; )(); // -0 !funkcja() ( zwróć fałsz; )(); // prawda ~funkcja() ( zwraca fałsz; )(); // -1 void function() ( zwraca false; )(); //nieokreślonyOperatorzy kombinowani:
!-funkcja () (zwróć fałsz; )(); // prawda var c = 5 * (2 - funkcja () (zwrot 1)()) // 5 var c = 5 * 2 - -~funkcja () (zwrot 1)() // 8Różnica między nazwanymi wyrażeniami funkcyjnymi a nienazwanymi wyrażeniami:
Często nazwa nadana wyrażeniu funkcji jest zbędna w kontekście pozostałej części kodu, chyba że do funkcji trzeba uzyskać dostęp z jej wnętrza. Zakres nazwy wyrażenia funkcji jest ograniczony wyłącznie do samej funkcji.Var f = funkcja getFactorial (n) ( return n ? n * getFactorial(n - 1) : 1; ); f(5); // 120
Ważny:
Pamiętaj, że kodujesz dla ludzi, więc staraj się unikać pisania kodu ninja. Wiedza podana w artykule jest przydatna w zrozumieniu wewnętrzna organizacja języka i nie pomyl się, jeśli nagle natkniesz się na takie wyrażenia w jednym z projektów lub na rozmowie kwalifikacyjnej.
Funkcje są jednym z podstawowych elementów budulcowych w JavaScript. Funkcja to procedura JavaScript — zestaw instrukcji, które wykonują zadanie lub obliczają wartość. Aby użyć funkcji, musisz ją zdefiniować gdzieś w zakresie, z którego chcesz ją wywołać.
A metoda to funkcja będąca właściwością obiektu. Przeczytaj więcej o obiektach i metodach w Praca z obiektami .
Wywoływanie funkcji
Zdefiniowanie funkcji nie powoduje jej wykonania. Zdefiniowanie funkcji po prostu nazywa funkcję i określa, co zrobić, gdy funkcja zostanie wywołana. Powołanie funkcja faktycznie wykonuje określone czynności ze wskazanymi parametrami. Na przykład, jeśli zdefiniujesz funkcję square , możesz ją nazwać w następujący sposób:
Kwadrat(5);
Poprzednia instrukcja wywołuje funkcję z argumentem 5. Funkcja wykonuje swoje instrukcje i zwraca wartość 25.
Funkcje muszą znajdować się w zakresie, gdy są wywoływane, ale deklarację funkcji można podnieść (pojawić się pod wywołaniem w kodzie), jak w tym przykładzie:
Konsola.log(kwadrat(5)); /* ... */ funkcja kwadrat(n) ( return n * n; )
Zakres funkcji to funkcja, w której jest zadeklarowana, lub cały program, jeśli jest zadeklarowany na najwyższym poziomie.
Notatka: Działa to tylko podczas definiowania funkcji przy użyciu powyższej składni (tj. funkcji funcName()()). Poniższy kod nie zadziała. Oznacza to, że przenoszenie funkcji działa tylko z deklaracją funkcji, a nie z wyrażeniem funkcji.
Konsola.log(kwadrat); // kwadrat jest podnoszony z niezdefiniowaną wartością początkową. console.log(kwadrat(5)); // Nieprzechwycony błąd typu: square nie jest funkcją var square = function(n) ( return n * n; )
Argumenty funkcji nie są ograniczone do łańcuchów i liczb. Do funkcji można przekazać całe obiekty. Funkcja show_props() (zdefiniowana w ) jest przykładem funkcji, która przyjmuje obiekt jako argument.
Funkcja może wywołać samą siebie. Na przykład, oto funkcja, która rekurencyjnie oblicza silnie:
Funkcja silnia(n) ( if ((n === 0) || (n === 1)) zwróć 1; w przeciwnym razie zwróć (n * silnia(n - 1)); )
Następnie możesz obliczyć silnie od 1 do 5 w następujący sposób:
Var a, b, c, d, e; a = silnia(1); // a otrzymuje wartość 1 b = silnia(2); // b otrzymuje wartość 2 c = silnia(3); // c otrzymuje wartość 6 d = silnia(4); // d otrzymuje wartość 24 e = silnia(5); // e otrzymuje wartość 120
Istnieją inne sposoby wywoływania funkcji. Często zdarza się, że funkcja musi być wywołana dynamicznie, liczba argumentów funkcji jest różna lub kontekst wywołania funkcji musi być ustawiony na konkretny obiekt określony w czasie wykonywania. Okazuje się, że funkcje same w sobie są obiektami, a te z kolei mają metody (patrz obiekt Function). Jedna z nich, metoda apply(), może zostać wykorzystana do osiągnięcia tego celu.
zakres funkcji
Zmienne zdefiniowane wewnątrz funkcji nie mogą być dostępne z dowolnego miejsca poza funkcją, ponieważ zmienna jest zdefiniowana tylko w zakresie funkcji. Jednak funkcja może uzyskać dostęp do wszystkich zmiennych i funkcji zdefiniowanych w zakresie, w którym jest zdefiniowana. Innymi słowy, funkcja zdefiniowana w zasięgu globalnym ma dostęp do wszystkich zmiennych zdefiniowanych w zasięgu globalnym. Funkcja zdefiniowana wewnątrz innej funkcji może również uzyskiwać dostęp do wszystkich zmiennych zdefiniowanych w jej funkcji nadrzędnej oraz do każdej innej zmiennej, do której funkcja nadrzędna ma dostęp.
// Następujące zmienne są zdefiniowane w zasięgu globalnym var num1 = 20, num2 = 3, name = "Chamahk"; // Ta funkcja jest zdefiniowana w funkcji zasięgu globalnego multiply() ( return num1 * num2; ) multiply(); // Zwraca 60 // Przykładowa funkcja zagnieżdżona funkcja getScore() ( var num1 = 2, num2 = 3; function add() ( return name + " scored " + (num1 + num2); ) return add(); ) getScore (); // Zwraca "Chamahk zdobył 5"
Zakres i stos funkcji
rekurencja
Funkcja może odwoływać się do siebie i wywoływać ją. Istnieją trzy sposoby, aby funkcja odwoływała się do siebie:
- nazwa funkcji
- zmienna w zakresie, która odnosi się do funkcji
Rozważmy na przykład następującą definicję funkcji:
Var foo = funkcja bar() ( // instrukcje idą tutaj );
W treści funkcji wszystkie poniższe są równoważne:
- bar()
- argumenty.callee()
- bla()
Funkcja, która wywołuje samą siebie, nazywa się a funkcja rekurencyjna. Pod pewnymi względami rekurencja jest analogiczna do pętli. Oba wykonują ten sam kod wiele razy i oba wymagają warunku (aby uniknąć nieskończonej pętli, a raczej nieskończonej rekurencji w tym przypadku). Na przykład następująca pętla:
Zmienna x = 0; podczas (x< 10) { // "x < 10" is the loop condition // do stuff x++; }
można przekształcić w funkcję rekurencyjną i wywołanie tej funkcji:
Funkcja loop(x) ( if (x >= 10) // "x >= 10" jest warunkiem wyjścia (odpowiednik "!(x< 10)") return; // do stuff loop(x + 1); // the recursive call } loop(0);
Jednak niektóre algorytmy nie mogą być prostymi pętlami iteracyjnymi. Na przykład, pobranie wszystkich węzłów struktury drzewa (np. DOM) jest łatwiejsze przy użyciu rekurencji:
Funkcja walkTree(node) ( if (node == null) // return; // zrób coś z node for (var i = 0; i< node.childNodes.length; i++) { walkTree(node.childNodes[i]); } }
W porównaniu z funkcją loop , każde samo wywołanie rekurencyjne wykonuje tutaj wiele wywołań rekurencyjnych.
Możliwe jest przekonwertowanie dowolnego algorytmu rekurencyjnego na nierekurencyjny, ale często logika jest znacznie bardziej złożona i wymaga użycia stosu. W rzeczywistości sama rekursja używa stosu: stosu funkcji.
Zachowanie podobne do stosu można zobaczyć w następującym przykładzie:
Funkcja foo(i) ( jeśli (i< 0) return; console.log("begin: " + i); foo(i - 1); console.log("end: " + i); } foo(3); // Output: // begin: 3 // begin: 2 // begin: 1 // begin: 0 // end: 0 // end: 1 // end: 2 // end: 3
Funkcje zagnieżdżone i domknięcia
Możesz zagnieździć funkcję w funkcji. Funkcja zagnieżdżona (wewnętrzna) jest prywatna względem funkcji zawierającej (zewnętrznej). Tworzy również zamknięcie. Zamknięcie to wyrażenie (zazwyczaj funkcja), które może mieć wolne zmienne wraz ze środowiskiem wiążącym te zmienne (które „zamyka” wyrażenie).
Ponieważ funkcja zagnieżdżona jest zamknięciem, oznacza to, że funkcja zagnieżdżona może „dziedziczyć” argumenty i zmienne funkcji zawierającej. Innymi słowy, funkcja wewnętrzna zawiera zakres funkcji zewnętrznej.
- Dostęp do funkcji wewnętrznej można uzyskać tylko z instrukcji w funkcji zewnętrznej.
- Funkcja wewnętrzna tworzy zamknięcie: funkcja wewnętrzna może używać argumentów i zmiennych funkcji zewnętrznej, podczas gdy funkcja zewnętrzna nie może używać argumentów i zmiennych funkcji wewnętrznej.
Poniższy przykład przedstawia funkcje zagnieżdżone:
Funkcja addSquares(a, b) ( funkcja square(x) ( return x * x; ) return square(a) + square(b); ) a = addSquares(2, 3); // zwraca 13 b = addSquares(3, 4); // zwraca 25 c = addSquares(4, 5); // zwraca 41
Ponieważ funkcja wewnętrzna tworzy zamknięcie, możesz wywołać funkcję zewnętrzną i podać argumenty zarówno dla funkcji zewnętrznej, jak i wewnętrznej:
Funkcja na zewnątrz(x) ( funkcja wewnątrz(y) ( zwróć x + y; ) zwróć do środka; ) fn_inside = na zewnątrz(3); // Pomyśl o tym tak: daj mi funkcję, która dodaje 3 do tego, co dasz // to wynik = fn_inside(5); // zwraca 8 wynik1 = na zewnątrz(3)(5); // zwraca 8
Zachowanie zmiennych
Zwróć uwagę, jak zachowywane jest x, gdy zwracane jest inside. Zamknięcie musi zachowywać argumenty i zmienne we wszystkich zakresach, do których się odwołuje. Ponieważ każde wywołanie dostarcza potencjalnie różnych argumentów, dla każdego wywołania na zewnątrz tworzone jest nowe zamknięcie. Pamięć można zwolnić tylko wtedy, gdy zwrócone wnętrze nie jest już dostępne.
Nie różni się to od przechowywania referencji w innych obiektach, ale często jest mniej oczywiste, ponieważ nie ustawia się referencji bezpośrednio i nie można ich sprawdzić.
Wielokrotnie zagnieżdżone funkcje
Funkcje mogą być wielokrotnie zagnieżdżone, tj. funkcja (A) zawierająca funkcję (B) zawierającą funkcję (C). Obie funkcje B i C tworzą tu domknięcia, więc B ma dostęp do A, a C ma dostęp do B. Ponadto, ponieważ C może uzyskiwać dostęp do B, który ma dostęp do A, C może również uzyskiwać dostęp do A. Zatem zamknięcia mogą zawierać wiele zakresów; zawierają one rekursywnie zakres funkcji, które go zawierają. To się nazywa łączenie zakresów. (Dlaczego nazywa się to „łańcuchami” zostanie wyjaśnione później.)
Rozważmy następujący przykład:
Funkcja A(x) ( funkcja B(y) ( funkcja C(z) ( konsola. log(x + y + z); ) C(3); ) B(2); ) A(1); // logi 6 (1 + 2 + 3)
W tym przykładzie C uzyskuje dostęp do B "s y i A "s x . Można to zrobić, ponieważ:
- B tworzy zamknięcie zawierające A , tj. B ma dostęp do argumentów i zmiennych A.
- C tworzy zamknięcie zawierające B .
- Ponieważ zamknięcie B zawiera A , zamknięcie C zawiera A , C może uzyskać dostęp do obu B oraz Argumenty i zmienne A. Innymi słowy, C więzy zakresy B i A w tej kolejności.
Nie jest jednak odwrotnie. A nie może uzyskać dostępu do C , ponieważ A nie może uzyskać dostępu do żadnego argumentu lub zmiennej B , której zmienna jest C . Zatem C pozostaje prywatne tylko dla B .
Konflikty nazw
Gdy dwa argumenty lub zmienne w zakresach domknięcia mają taką samą nazwę, występuje konflikt nazw. Więcej wewnętrznych zakresów ma pierwszeństwo, więc najbardziej wewnętrzny zakres ma najwyższy priorytet, a najbardziej zewnętrzny zakres ma najniższy. To jest łańcuch zasięgu. Pierwszy w łańcuchu to najbardziej wewnętrzny zakres, a ostatni to najbardziej zewnętrzny zakres. Rozważ następujące:
Funkcja outside() ( var x = 5; funkcja inside(x) ( return x * 2; ) return inside; ) outside()(10); // zwraca 20 zamiast 10
Konflikt nazw ma miejsce w instrukcji return x i znajduje się pomiędzy wewnętrznym parametrem x a zewnętrzną zmienną x . Tutaj łańcuch zasięgu to ( wewnątrz , na zewnątrz , obiekt globalny). Dlatego wewnętrzne "s x ma pierwszeństwo przed zewnętrznym "s x , a 20 (wewnątrz "s x) jest zwracane zamiast 10 (na zewnątrz "s x).
Domknięcia
Zamknięcia to jedna z najpotężniejszych funkcji JavaScript. JavaScript pozwala na zagnieżdżanie funkcji i zapewnia funkcji wewnętrznej pełny dostęp do wszystkich zmiennych i funkcji zdefiniowanych wewnątrz funkcji zewnętrznej ( i wszystkie inne zmienne i funkcje, do których ma dostęp funkcja zewnętrzna). Jednak funkcja zewnętrzna nie ma dostępu do zmiennych i funkcji zdefiniowanych wewnątrz funkcji wewnętrznej. Zapewnia to rodzaj hermetyzacji zmiennych funkcji wewnętrznej. Ponadto, ponieważ funkcja wewnętrzna ma dostęp do zakresu funkcji zewnętrznej, zmienne i funkcje zdefiniowane w funkcji zewnętrznej będą żyć dłużej niż czas wykonywania funkcji zewnętrznej, jeśli funkcja wewnętrzna zdoła przetrwać poza okresem życia funkcji zewnętrznej. funkcjonować. Zamknięcie jest tworzone, gdy funkcja wewnętrzna jest w jakiś sposób udostępniana dowolnemu zakresowi poza funkcją zewnętrzną.
Var pet = function(name) ( // Zewnętrzna funkcja definiuje zmienną nazwaną "nazwa" var getName = function() ( zwraca nazwę; // Wewnętrzna funkcja ma dostęp do zmiennej "nazwa" zewnętrznej //funkcji ) return getName // Zwróć funkcję wewnętrzną, wystawiając ją w ten sposób na zakresy zewnętrzne ) myPet = pet("Vivie"); mój zwierzak(); // Zwraca "Vivie"
Może być znacznie bardziej złożony niż powyższy kod. Można zwrócić obiekt zawierający metody manipulowania zmiennymi wewnętrznymi funkcji zewnętrznej.
Var createPet = function(name) ( var sex; return ( setName: function(newName) ( name = newName; ), getName: function() ( zwraca name; ), getSex: function() ( return sex; ), setSex: function(newSex) ( if(typeof newSex === "string" && (newSex.toLowerCase() === "mężczyzna" || newSex.toLowerCase() === "kobieta")) ( sex = newSex; ) ) ) ) var pet = createPet("Vivie"); zwierzę.getNazwa(); // Vivie pet.setName("Oliver"); pet.setSex("mężczyzna"); zwierzak.getSex(); // mężczyzna zwierzak.getName(); // Oliver
W powyższym kodzie zmienna name funkcji zewnętrznej jest dostępna dla funkcji wewnętrznych i nie ma innego sposobu uzyskania dostępu do zmiennych wewnętrznych poza funkcjami wewnętrznymi. Wewnętrzne zmienne funkcji wewnętrznych działają jako bezpieczne magazyny dla zewnętrznych argumentów i zmiennych. Przechowują „trwałe” i „zamknięte” dane, z którymi mogą pracować wewnętrzne funkcje. Funkcje nie muszą być nawet przypisane do zmiennej ani mieć nazwy.
Var getCode = (function() ( var apiCode = "0]Eal(eh&2"; // Kod, którego nie chcemy, aby osoby postronne mogły modyfikować... return function() ( return apiCode; ); ))() ;getCode();// Zwraca kod apiCode
Istnieje jednak kilka pułapek, na które należy uważać podczas korzystania z zamknięć. Jeśli zamknięta funkcja definiuje zmienną o takiej samej nazwie jak nazwa zmiennej w zakresie zewnętrznym, nie ma możliwości ponownego odwołania się do zmiennej w zakresie zewnętrznym.
Var createPet = function(name) ( // Zewnętrzna funkcja definiuje zmienną o nazwie "name". return ( setName: function(name) ( // Załączona funkcja definiuje również zmienną o nazwie "name". name = name; // Jak uzyskać dostęp do „nazwy” zdefiniowanej przez funkcję zewnętrzną? )) )
Korzystanie z argumentów obiektu
Argumenty funkcji są utrzymywane w obiekcie podobnym do tablicy. Wewnątrz funkcji możesz adresować przekazane do niej argumenty w następujący sposób:
Argumenty
gdzie i jest liczbą porządkową argumentu, zaczynając od zera. Zatem pierwszym argumentem przekazanym do funkcji będzie arguments . Całkowita liczba argumentów jest wskazywana przez arguments.length .
Używając obiektu arguments, możesz wywołać funkcję z większą liczbą argumentów, niż jest to formalnie zadeklarowane do zaakceptowania. Jest to często przydatne, jeśli nie wiesz z góry, ile argumentów zostanie przekazanych do funkcji.Możesz użyć arguments.length, aby określić liczbę argumentów faktycznie przekazanych do funkcji, a następnie uzyskać dostęp do każdego argumentu za pomocą obiektu arguments.
Rozważmy na przykład funkcję, która łączy kilka ciągów. Jedynym formalnym argumentem funkcji jest ciąg znaków, który określa znaki oddzielające elementy do połączenia. Funkcja jest zdefiniowana w następujący sposób:
Function myConcat(separator) ( var result = ""; // inicjalizacja listy var i; // iteracja przez argumenty dla (i = 1; i< arguments.length; i++) { result += arguments[i] + separator; } return result; }
Możesz przekazać dowolną liczbę argumentów do tej funkcji i łączy ona każdy argument w ciąg „lista”:
// zwraca "red, orange, blue, " myConcat(", ", "red", "orange", "blue"); // zwraca "słoń; żyrafa; lew; gepard; " myConcat("; ", "słoń", "żyrafa", "lew", "gepard"); // zwraca "szałwia. bazylia. oregano. pieprz. pietruszka. " myConcat(". ", "szałwia", "bazylia", "oregano", "pieprz", "pietruszka");
Notatka: Zmienna arguments jest podobna do tablicy, ale nie jest tablicą. Jest podobny do tablicy, ponieważ ma numerowany indeks i właściwość length. Jednak nie posiada wszystkich metod manipulacji tablicami.
Na wprowadzenie funkcji strzałkowych wpłynęły dwa czynniki: funkcje krótsze i niewiążące tego .
Krótsze funkcje
W niektórych wzorcach funkcjonalnych mile widziane są krótsze funkcje. porównywać:
Var a = [ "wodór", "hel", "lit", "beryl" ]; var a2 = a.map(function(s) ( return s.length; )); dziennik konsoli(a2); // loguje var a3 = a.map(s => s.length); dziennik konsoli (a3); // dzienniki
Nie ma oddzielnego tego
Do czasu funkcji strzałek każda nowa funkcja definiowała swoją wartość (nowy obiekt w przypadku konstruktora, niezdefiniowany w wywołaniach funkcji, obiekt bazowy, jeśli funkcja jest wywoływana jako „metoda obiektowa” itp.). Okazało się to mniej niż idealne w przypadku programowania zorientowanego obiektowo.
Funkcja Person() ( // Konstruktor Person() definiuje `this` jako siebie. this.age = 0; setInterval(function growUp() ( // W trybie nieścisłym funkcja growUp() definiuje `this` // jako obiekt globalny, który różni się od `this` // zdefiniowanego przez konstruktor Person().this.age++; ), 1000); ) var p = new Person();
W ECMAScript 3/5 ten problem został rozwiązany przez przypisanie wartości this do zmiennej, którą można było zamknąć.
Function Person() ( var self = this; // Niektórzy wybierają `that` zamiast `self`. // Wybierz jedną i bądź konsekwentny. self.age = 0; setInterval(function growUp() ( // Callback odnosi się do zmienna `self` której // wartością jest oczekiwany obiekt.self.age++; ), 1000); )
W poprzednich rozdziałach rozważaliśmy te elementarne „cegiełki” (operatory i wyrażenia), z których zbudowany jest program. We wczesnych językach programowania, takich jak pierwsze wersje Basica, to był koniec. Program to sekwencja instrukcji i to wszystko. Dopóki programy są małe, to podejście jest całkiem wykonalne. Jeśli program ma 10 instrukcji, nie jest potrzebna dodatkowa struktura. Ale jeśli program ma 10 000 wyciągów lub 10 000 000 wyciągów (a są takie programy i działają), to nie można obejść się bez wprowadzenia dodatkowej struktury.
VBA obsługuje następującą strukturę programu. Na najwyższy poziom W hierarchii znajduje się aplikacja, następnie projekty związane z rzeczywistymi dokumentami tej aplikacji, na trzecim poziomie są moduły (moduły aplikacji, moduły użytkownika, moduły klas, moduły formularzy i moduły linków). A na ostatnim poziomie są procedury i funkcje tych modułów.
Ta struktura programu całkowicie spełnia zasady programowania strukturalnego i modułowego. W tej sekcji szczegółowo omówimy pracę na poziomie modułu, omówimy pracę z aplikacjami i projektami w sekcji 20.6 „Redaktor Visual Basic dla aplikacji".
Więc, moduł - jest to część programu zaprojektowana w taki sposób, aby mogła być emitowana niezależnie. Moduł z kolei składa się z dwóch sekcji: sekcja ogłoszeń(Deklaracje) oraz sekcja dotycząca procedur i funkcji. W rozdziale Deklaracje opisuje zmienne globalne, typy zdefiniowane przez użytkownika i typy wyliczane. W następnej sekcji opisano procedury i funkcje. Procedura jest najmniejszą semantycznie kompletną konstrukcją programu, którą można wykonać. W końcu operatory nie są wykonywane i pisane tak po prostu, są w opisie procedur i funkcji.
Obszar widoczności - jest to obszar programu, w którym widoczna jest nazwa zmiennej, co oznacza, że można uzyskać dostęp do jej wartości.
Istnieją trzy poziomy widoczności i pięć sposobów deklarowania:
Procedura (zakres - tylko procedura, w której zadeklarowana jest zmienna).
- Instrukcja Dim deklaruje zmienną w treści procedury iw dowolnym miejscu procedury, ale przed instrukcjami, które jej używają. Czas życia tej zmiennej to zakres procedury, czyli przy wpisywaniu Tej procedury pamięć jest alokowana na zmienną i jest ona inicjowana, następnie w trakcie wykonywania procedury wartość zmiennej może ulec zmianie, po wyjściu z procedury przydzielona pamięć zostaje zwolniona, a co za tym idzie wartość zmiennej jest tracona .
- Instrukcja static jest antagonistą instrukcji Dim, deklaruje zmienną statyczną. Różnica polega na tym, że gdy procedura kończy się, pamięć nie jest zabierana zmiennej statycznej, ale staje się (ze względu na zakres) czasowo niedostępna, a zatem jej wartość jest zapisywana, co można wykorzystać przy ponownym wywołaniu procedury .
Moduł (zakres - wszystkie procedury modułu, w którym zadeklarowana jest zmienna):
- Prywatne oświadczenie deklaruje zmienną w sekcji deklaracji Deklaracje(poza procedurami modułu).
- Operator Dim jest absolutnie analogiczny (w tym przypadku) do operatora Private.
Aplikacja (zakres - wszystkie procedury wszystkich modułów aktywnej aplikacji):
- Oświadczenie publiczne deklaruje zmienną w sekcji deklaracji deklaracje.
Procedury, podobnie jak wszystkie elementy zdefiniowane przez użytkownika VBA, wymagają deklaracji. Deklaracja procedury ma następującą składnię:
Nazwa procedury podrzędnej ([ Lista argumentów ])
[ blok instrukcji1 ]
[ Blok instrukcji2 ] Koniec Sub
Słowo kluczowe Private określa kolejny zakres procedury — tylko moduł, w którym jest zadeklarowany. Oznacza to, że tylko procedury tego samego modułu mogą go wywołać. Z kolei słowo kluczowe Public powoduje, że procedura jest dostępna dla wszystkich modułów w projekcie. Domyślnie procedura jest publiczna, czyli ma status Publiczny. Jeśli chodzi o użycie słowa kluczowego Friend, omówimy go nieco później, gdy będziemy mówić o klasach VBA.
Po oświadczeniu deklaracji pojawia się opcjonalny słowo kluczowe statyczne, co powoduje, że wszystkie zmienne lokalne są statyczne. To stwierdzenie jest równoznaczne z faktem, że każda ze zmiennych opisanych w ciele zmiennych procedury byłaby zadeklarowana jako statyczna.
Nazwa procedury to identyfikator procedury, który spełnia wszystkie konwencje nazewnictwa.
Po nazwie następują wymagane nawiasy, ale opcjonalny Argument-List. Przyjrzyjmy się bliżej deklaracji pojedynczego argumentu; jeśli jest ich więcej, są po prostu oddzielone przecinkiem.
Nazwa argumentu [()] [= wartość domyślna]
Słowo kluczowe Optional oznacza, że argument jest opcjonalny i można go pominąć podczas wywoływania procedury. Domyślnie argument jest wymagany. Wszystkie opcjonalne argumenty muszą następować po wymaganych. Oczywiście parametr opcjonalny wartośćDomyślna jest wartością opcjonalnego argumentu, jeśli nie jest on podany podczas wywoływania procedury. Jeśli konstrukcja zawiera słowo kluczowe ParamArray, nie można użyć słowa kluczowego Optional.
Jako parametry rzeczywiste procedura może otrzymywać nie tylko wartości stałych, ale także wartości zmiennych. Przekazując zmienne do procedury jako parametry, można użyć jednej z dwóch metod: ByVal (według wartości) i ByRef (przez odwołanie).
Aby zrozumieć różnicę między tymi dwiema metodami, należy wziąć pod uwagę pamięć i mechanizm przekazywania parametrów „od wewnątrz”. Tak więc podczas deklarowania zmiennej dowolnego typu przydzielany jest obszar w pamięci komputera, w którym będzie przechowywana wartość zmiennej. Wielkość tego obszaru zależy oczywiście od rodzaju tej zmiennej. Teraz, wiedząc, jak zmienna działa w komputerze, rozważmy przekazanie jej jako parametru do procedury.
Jeśli zmienna jest przekazywana do procedury przez odwołanie (to znaczy poprzez użycie słowa kluczowego ByRef przed jej nazwą), to adres tej zmiennej w pamięci zostanie przekazany do procedury. W takim przypadku identyfikowany jest formalny argument procedury i przekazany parametr rzeczywisty.
Zatem wywołana procedura, zmieniając wartość parametru formalnego, zmienia wartość zmiennej.
Jeśli zmienna jest przekazywana przez wartość (to znaczy przez użycie słowa kluczowego Byval przed jej nazwą), to kompilator tworzy tymczasową kopię tej zmiennej, a do procedury jest przekazywany adres tej kopii zmiennej. Zatem wywoływana procedura, zmieniając wartość parametru formalnego, zmienia wartość zmiennej kopii (ale nie samej zmiennej), która zostanie zniszczona po zakończeniu procedury. Domyślnie zmienne są przekazywane przez referencję w VBA.
Po zastanowieniu się, jak zmienne można przekazać do procedury, wróćmy do dalszego przeglądu jej konstrukcji. Następny parametr paramArray może pojawić się tylko przed ostatnim argumentem na liście argumentów, wskazując, że jest to opcjonalna tablica elementów typu wariant.
nazwa-argumentu - jest to identyfikator konwencji nazewnictwa, który reprezentuje argument w treści procedury. Parametr typ danych jest wbudowanym typem danych lub typem zdefiniowanym przez użytkownika. Domyślna wpiszDanky jest wariantem.
Po opisaniu procedury Operatorzy Bloku1(powszechnie nazywany organ postępowania) w którym można użyć wartości argumentów "procedury. Jeżeli podczas wykonywania instrukcji procedury napotkane zostanie polecenie Exit Sub (wyjście z procedury), to wykonanie procedury zostaje przerwane i następuje kontrola jest przekazywany do instrukcji po instrukcji wywołania procedury.
Funkcja różni się od procedury tym, że oprócz wykonywania instrukcji zwraca wartość. Składnia deklaracji funkcji różni się nieco od procedury:
Funkcja FunctionName [(ArgumentList)]
[blok instrukcji1]
[NazwaFunkcji = Wyrażenie]
[blok instrukcji2]
[Nazwa Funkcji = Wyrażenie] Zakończ funkcję
Po pierwsze, słowo sub zostało zmienione na Function. Po drugie, po zadeklarowaniu argumentów należy określić typ wartości zwracanej przez funkcję. Po trzecie, w ciele funkcji znajduje się przypisanie do nazwy funkcji pewnej wartości, która ma zadeklarowany typ. Oczywiście takie przypisanie jest opcjonalne, ale wtedy twoja funkcja będzie wyglądać jak procedura, a wynikiem funkcji będzie domyślna wartość zdefiniowana dla odpowiedniego typu. Wreszcie, zamiast słowa kluczowego Exit Sub, słowo kluczowe Exit Function służy do wyjścia z funkcji.
Użyjmy przykładu dotyczącego wydawnictwa i sklepów, aby opisać procedurę inicjowania szeregu aplikacji. Mamy więc argument tablicowy, który jest przekazywany do procedury, a procedura inicjuje go za pomocą standardowej funkcji inputBox. Aby określić górną i dolną granicę tablicy, użyj standardowe funkcje LBound i uBound.
W przypadku funkcji jako argumenty podaje się tablicę aplikacji i ilość książek na stanie, zwracana jest wartość logiczna prawdziwa wartość, jeśli żądania wszystkich sklepów są spełnione, a Fałsz w przeciwnym razie. Przy okazji, argument liczba książek będzie opcjonalny, domyślnie równy 5000.
Program 20.14. Deklarowanie procedur i funkcji
Public Sub InitBookShops(arr() jako liczba całkowita)
Dim i, str For i = LBound (arr) Do UBound (arr)
str = "Wprowadź zamówienie dla sklepu #" & i arr(i) = InputBox(str) Next i End Sub
Funkcja publiczna SaleAbility(arr() As Integer, _ "
Opcjonalne numOfBooks As Integer = 5000) As Boolean
Dla każdego elementu w arr
sumOfBooks = sumOfBooks + elem Dalej Jeśli sumOfBooks< numOfBooks Then
Zdolność sprzedaży = prawda inaczej
SaleAbility = False End If End Function
Komentarz
W ciele funkcji SaleAbility istnieje celowa irracjonalność. Zamiast ostatniego wyrażenia if. . .Następnie. . .W przeciwnym razie możesz i powinieneś napisać równoważną, bardziej wydajną instrukcję przypisania SaleAbility = sumOfBooks< numOfBooks. Этим замечанием мы специально акцентируем внимание читателя на подобных мелких, но важных "хитростях" хорошего стиля программирования.
Oprócz powyższej deklaracji procedur i funkcji, w VBA istnieje: specjalny rodzaj procedury. Są to procedury reagowania na zdarzenie wywołane przez system lub użytkownika. (Patrz rozdział 22 Tworzenie aplikacji). Na przykład dla Dokumenty Word definiowane są zdarzenia otwarcia i zamknięcia, dla skoroszytów Excela – Beforesave i Beforedose, dla obiektów klasy niestandardowej – inicjalizuj i Zakończ, zdarzeniem jest również naciśnięcie przycisku okna dialogowego itp. Użytkownik ma możliwość stworzenia procedury reagowania na takie zdarzenia, na przykład poproś o wyświetlenie komunikatu „Do widzenia, dzięki za pracę!” podczas zamykania dokumentu.
Składnia takiej procedury jest taka sama jak zwykłej, tylko jej nazwa wskazuje najpierw obiekt, z którym zdarzenie będzie skojarzone, następnie znak podkreślenia (_), a następnie faktyczną nazwę zdarzenia.
Program 20.15. Procedura reakcji na zdarzenie
Prywatny dokument podrzędny_Zamknij()
MsgBox ("Do widzenia, dzięki za twoją pracę!")
Komentarz
Zarządzanie wydarzeniami to sposób na strukturyzację kod programu w oparciu o następujący pomysł. Istnieje pewien predefiniowany zestaw nazwanych zdarzeń. Zdarzenia mogą być jawnie skojarzone z obiektami lub mogą być niejawnie skojarzone lub skojarzone z niejawnymi obiektami, w tym drugim przypadku zdarzenia są zwykle nazywane zdarzeniami systemowymi. Mogą wystąpić zdarzenia. Wystąpienie zdarzenia oznacza, że stan systemu zmienił się w jakiś sposób. Zdarzeniem może być powiązana procedura, zwana odpowiedzią na zdarzenie. W przypadku wystąpienia zdarzenia automatycznie wywoływana jest procedura reakcji. W nowoczesnych systemach programowania obsługujących zarządzanie zdarzeniami przewidziana jest duża liczba różnorodnych zdarzeń, na które można zdefiniować w programie reakcje, np.: naciśnięcie klawisza na klawiaturze, trafienie wskaźnikiem myszy w określonym obszarze ekran, osiągnięcie zadanej wartości przez wewnętrzny zegar, otwarcie danego pliku itp. W programie całkowicie sterowanym zdarzeniami nie ma głównego przepływu sterowania, znajduje się on poza programem (w systemie operacyjnym lub w systemie administracyjnym run-time, czyli tam, gdzie zaimplementowany jest mechanizm zdarzeń). Sterowanie wchodzi do programu tylko w formie wywołania procedury reakcji. Taka organizacja programu zapewnia wysoką modułowość, przejrzystość, zrównoważoną strukturę i inne przydatne właściwości. Oczywiste jest, że jeśli skojarzysz zdarzenia z poleceniami aplikacji (jak to zwykle się robi), to zarządzanie zdarzeniami najlepiej nadaje się do implementacji interfejsu użytkownika.
Nowoczesne systemy programowania posiadają bogate i ewoluujące biblioteki gotowych komponentów zwanych kontrolkami, które są ściśle zintegrowane z wbudowanymi mechanizmami zarządzania zdarzeniami. Korzystanie z gotowych kontrolek jest wygodne, produktywne i powinno być zalecane w większości przypadków. Więcej informacji na ten temat znajduje się w rozdziale 22 Tworzenie aplikacji.
Oczywiście oprócz deklarowania procedur i funkcji należy ich używać – tzw. Można to zrobić na kilka sposobów, a „kilka” to bardzo słabe słowo. VBA zapewnia użytkownikowi tak elastyczny system wywoływania procedur i funkcji, że musi się zastanowić, jak to zrobić Co sposobów wywołania procedury.
Pierwsza, najprostsza, zadzwoń:
ProceduraName RzeczywisteListaParametrów
NazwaProcedury -to jest twoja nazwana procedura, ilistActualPara - metry - jest to lista rzeczywistych parametrów przekazywanych do procedury podczas jej wywołania. Musi być zgodny z wymaganą listą argumentów określoną podczas deklarowania procedury. Rzeczywiste parametry, jeśli jest więcej niż jeden, są wymienione oddzielone przecinkami; ich kolejność musi być zgodna z zadeklarowanymi argumentami. Zauważ, że podczas wywoływania takiej procedury nie ma potrzeby umieszczania listy rzeczywistych parametrów w nawiasach.
Możesz również wywołać procedurę za pomocą słowa kluczowego Call: Call ProcedureName (Lista ActualParameters)
Istota wszystkich parametrów w Ta metoda połączenie pozostaje takie samo. Różnica polega na tym, że listę rzeczywistych parametrów należy umieścić w nawiasach.
Wywołanie funkcji różni się nieco od wywołania procedury. Główna różnica polega na tym, że możesz przekazać obliczoną wartość funkcji do jakiejś zmiennej, więc wywołanie funkcji wygląda tak:
Nazwa zmiennej = FunctionName (ActualParameterList)
Posłużmy się przykładem wyżej zadeklarowanych procedur i funkcji, aby pokazać ich wywołanie.
Program 20.16. Wywoływanie procedur i funkcji
Dim księgarnie (1 do 25) As Integer Dim wynik As Boolean
wynik = SaleAbility (księgarnie, 3000)
MsgBox(wynik) Koniec napisu
W rozważanych metodach wywoływania rzeczywiste parametry były ułożone w takiej samej kolejności jak argumenty formalne podczas deklarowania procedury lub funkcji. W niektórych przypadkach, zwłaszcza gdy procedura zawiera dużą liczbę opcjonalnych argumentów, można skorzystać z unikalnej funkcji VBA - nazwane argumenty. Przy takim wywołaniu oprócz wartości rzeczywistego parametru podana jest również nazwa
formalny argument, któremu odpowiada dana wartość. Aby to zrobić, po nazwie argumentu następuje dwukropek i znak równości, po którym następuje rzeczywisty parametr. To bardzo przydatna sztuczka, która pozwala zobaczyć relację argumentu z rzeczywistym parametrem.
Program 20.17. Używanie nazwanych argumentów
Dim księgarnie (1 do 25) jako Integer
Wynik przyciemnienia As Boolean
wynik = SaleAbility(arr:= księgarnie, numOfBooks:= 3000)
MsgBox(wynik) Koniec napisu
Opisując składnię deklaracji procedury, wspomnieliśmy pokrótce o słowie kluczowym ParamArray, czas zwrócić na to uwagę. Zdolność do przekazania nieznanej liczby rzeczywistych parametrów do procedury jest ponownie unikalna dla wielu innych języków programowania.
Na przykład stworzymy procedurę zliczania całkowitej liczby żądań za pomocą parametru ParamArray. Wywołując tę procedurę w procedurze Testy, można określić dowolną liczbę rzeczywistych parametrów tablicy oświadczeń.
Program 20.18. Korzystanie z parametru ParamArray
Sub FullSum (ParamArray arr() jako wariant)
Dim sum jako liczba całkowita
For i = LBound(arr) To UBound(arr) sum = sum + arr(i)
MsgBox (suma) Koniec Sub
FullSum 100, 2000, 350, 450 Koniec Sub
Rozważmy inny sposób wywoływania procedur lub funkcji — wywołanie rekurencyjne, czyli wywołanie, w którym procedura jest wywoływana z własnego ciała. Standardowym przykładem funkcji rekurencyjnej jest obliczenie czynnikowe.
Program 20.19. Rekurencyjne wywołanie funkcji
Funkcja fctrl(n jako liczba całkowita) jako wariant
Jeśli(n<= 1) Then fctrl = 1
fctrl = n * fctrlfn - 1) End If End Function
MsgBox fctrl(20) Koniec Sub
Z reguły wywołania rekurencyjne nie powinny być nadużywane, ponieważ wywołania rekurencyjne szybko zapełniają pamięć stosu komputera i ich przetwarzanie zajmuje znacznie więcej czasu. W naszym przypadku możemy uniknąć użycia wywołania rekurencyjnego, zastępując je zwykłą pętlą. Chociaż oczywiście zdarzają się sytuacje, w których zastosowanie metod rekurencyjnych zauważalnie przyspiesza pracę, np. przy pracy z drzewiastymi strukturami danych.
Na koniec przyjrzymy się przykładowi pokazującemu różnicę między przekazywaniem parametrów przez referencję i przez wartość, który pokazuje dwie procedury: RefVal i MainCalc. Procedura pomocnicza RefVal wykorzystuje trzy formalne argumenty, które są różnie opisane. W dalszej części tej procedury każdy z nich jest zwiększany o jeden, a następnie wyświetlane są ich wartości. Główna procedura MainCalc ustawia wartości zmiennych a, b, c, a następnie przekazuje je jako parametry do procedury RefVal. W tym przypadku pierwszy parametr jest przekazywany przez odwołanie (domyślnie), drugi - przez wartość, a trzeci - ponownie przez odwołanie. Po powrocie procedury RefVal, główna procedura wyświetla również wartości trzech zmiennych przekazanych jako parametry. Na ekranie wyświetlanych jest łącznie sześć wartości. Po pierwsze są to liczby 11, 21 i 31 (wszystkie otrzymane wartości są powiększone o 1 i są wyświetlane przez procedurę RefVal). Dalej są liczby AND, 20 i 31 (wartości te są wyświetlane przez procedurę MainCalc, a zmienne przekazywane przez referencję wzrosły, ale zmienna przekazana przez wartość nie).
Program 20.20. Różnica między ByRef i ByVal
SubRefVal(x, ByVal y, ByRef z)
MsgBox (z) Koniec Sub
Sub MainCalc 0 a = 10 b = 20 s = 30 Call RefVal(a, b, c)
MsgBox(a) MsgBox(b) MsgBox(c) Koniec Sub
Rozważaliśmy więc pracę z procedurami i funkcjami zdefiniowanymi przez użytkownika, ale oprócz tej możliwości istnieje wiele różnych wbudowanych procedur i funkcji, które pozwalają programiście nie myśleć o implementacji standardowych operacji, takich jak porównywanie ciągów lub branie sinusa pewnej liczby. Niestety zakres naszej książki nie pozwala na opisanie nawet niewielkiej części wbudowanych procedur i funkcji (a jest to bezużyteczne), ale zawsze możesz znaleźć ich pełną listę i opis we wbudowanej pomocy Outlooka .
Wyrażenia w JavaScript są kombinacje operandy oraz operatorzy.
Operacje w wyrażeniach są wykonywane sekwencyjnie według wartości priorytetu (im wyższy priorytet, tym wyższy). Zwrócony wynik nie zawsze jest tego samego typu co typ przetwarzanych danych. Na przykład operacje porównania obejmują operandy różnych typów, ale zwracany wynik zawsze będzie typem logicznym.
Ryż. 1. Struktura wyrażenia w JavaScriptoperandy to dane przetwarzane przez skrypt JavaScript. Operandy mogą być zarówno prostymi, jak i złożonymi typami danych, a także innymi wyrażeniami.
Operatorzy to symbole języka, które wykonują różne operacje na danych. Operatory można pisać za pomocą znaków interpunkcyjnych lub słów kluczowych.
W zależności od liczby operandów rozróżnia się następujące typy operatorów:
jednoargumentowy- jeden operand jest zaangażowany w operację;
dwójkowy— w operacji uczestniczą dwa operandy;
potrójny— łączy trzy argumenty.
Najprostszą formą wyrażenia jest dosłowny— coś, co sam siebie ocenia, na przykład liczba 100 , ciąg „Hellow world” . Zmienna może być również wyrażeniem, ponieważ jej wartością jest przypisana do niej wartość.
Wyrażenia i operatory w JavaScript
1. Operatory arytmetyczne
Operatory arytmetyczne zaprojektowane do wykonywania operacji matematycznych, działają na operandach numerycznych (lub zmiennych przechowujących wartości liczbowe) i zwracają w wyniku wartość liczbową.
Jeśli jeden z operandów jest łańcuchem, interpreter JavaScript spróbuje przekonwertować go na typ liczbowy, a następnie wykona odpowiednią operację. Jeśli konwersja typu nie powiedzie się, wynikiem będzie NaN (nie liczba).
Operator/operacja | Opis | Priorytet |
---|---|---|
+ Dodatek | Dodaje operandy numeryczne. Jeśli jeden z operandów jest łańcuchem, to wynikiem wyrażenia jest łańcuch. | 12 |
- Odejmowanie | Odejmuje drugi operand od pierwszego. | 12 |
- Jednoargumentowy minus | Konwertuje liczbę dodatnią na liczbę ujemną i odwrotnie. | 14 |
* Mnożenie | Mnoży dwa operandy. | 13 |
/ Podział | Dzieli pierwszy operand przez drugi. Wynikiem dzielenia może być liczba całkowita lub liczba zmiennoprzecinkowa. | 13 |
% Modulo (pozostała część podziału) | Oblicza resztę z dzielenia liczb całkowitych pierwszego operandu przez drugi. Dotyczy zarówno liczb całkowitych, jak i zmiennoprzecinkowych. | 13 |
2. Operatorzy przypisania
Operatorzy przypisania służą do przypisywania wartości do zmiennych. Operatory połączone umożliwiają przechowywanie początkowej i kolejnej wartości w jednej zmiennej.
zm a = 5; // przypisz wartość liczbową 5 do zmiennej a var b = "hellow"; // zapisz ciąg hellow w zmiennej b var m = n = z = 10; // przypisz zmiennym m, n, z wartość liczbową 10 x += 10; // odpowiednik x = x + 10; x-= 10; // odpowiednik x = x - 10; x *= 10; // odpowiednik x = x * 10; x /= 10; // odpowiednik x = x / 10; x%= 10; // odpowiednik x = x % 10;3. Operatory inkrementacji i dekrementacji
Operacje inkrementacja i dekrementacja są jednoargumentowe i zwiększają i zmniejszają wartość operandu o jeden. Operandem może być zmienna, element tablicy, właściwość obiektu. Najczęściej takie operacje służą do zwiększania licznika w pętli.
var x = y = m = n = 5, z, s, k, l; z = ++x * 2; /* w wyniku obliczeń zwróci wartość z = 12, x = 6, czyli wartość x jest najpierw zwiększana o 1, a następnie wykonywana jest operacja mnożenia */ s = y++ * 2; /* w wyniku obliczeń zwróci wartość s = 10, y = 6, czyli najpierw wykonywana jest operacja mnożenia, a następnie wartość zwiększona o 1 jest przechowywana w zmiennej y */ k = --m * 2; // zwróci wartość k = 8, m = 4 l = n-- * 2; // zwróci wartość l = 10, n = 44. Operatory porównania
Operatory porównania służą do dopasowywania operandów, wynikiem wyrażenia może być jedna z dwóch wartości – prawda lub fałsz . Operandami mogą być nie tylko liczby, ale także łańcuchy, wartości logiczne i obiekty. Jednak porównanie można przeprowadzić tylko na liczbach i łańcuchach, więc argumenty, które nie są liczbami lub łańcuchami, są konwertowane.
Jeśli oba operandy nie mogą zostać pomyślnie przekonwertowane na liczby lub ciągi, operatory zawsze zwracają false .
Jeśli oba operandy są ciągami/liczbami lub mogą zostać przekonwertowane na ciągi/liczby, zostaną porównane jako ciągi/liczby.
Jeśli jeden operand jest łańcuchem/konwertuje na łańcuch, a drugi jest liczbą/konwertuje na liczbę, operator spróbuje przekonwertować łańcuch na liczbę i wykona porównanie liczbowe. Jeśli ciąg nie jest liczbą, jest konwertowany na NaN, a porównanie daje wynik false .
Najczęściej operacje porównawcze są używane przy organizowaniu oddziałów w programach.
Operator/operacja | Opis | Priorytet |
---|---|---|
== Równość | Testuje dwie wartości pod kątem dopasowania, umożliwiając konwersję typu. Zwraca prawdę, jeśli operandy są takie same, i fałsz, jeśli są różne. | 9 |
!= Nierówność | Zwraca prawdę, jeśli operandy nie są równe | 9 |
=== Tożsamość | Testuje dwa operandy pod kątem "tożsamości" przy użyciu ścisłej definicji dopasowania. Zwraca true, jeśli operandy są równe bez konwersji typu. | 9 |
!== Nie identyczne | Wykonuje kontrolę tożsamości. Zwraca true, jeśli operandy nie są równe bez konwersji typu. | 9 |
> Więcej | Zwraca true, jeśli pierwszy operand jest większy niż drugi, w przeciwnym razie zwraca false . | 10 |
>= Większe lub równe | Zwraca true, jeśli pierwszy operand jest nie mniejszy niż drugi, w przeciwnym razie zwraca false . | 10 |
Zwraca true, jeśli pierwszy operand jest mniejszy niż drugi, w przeciwnym razie zwraca false . | 10 | |
Zwraca true, jeśli pierwszy operand nie jest większy niż drugi, w przeciwnym razie zwraca false . | 10 |
5. Operatory logiczne
Operatory logiczne pozwalają łączyć warunki, które zwracają wartości logiczne. Najczęściej używane w instrukcji if.
(2 < 3) && (3===3); // вернет true, так как выражения в обеих скобках дают true (x < 10 && x >0); // zwróci true jeśli x jest pomiędzy 0 a 10 !false; // zwraca prawdę6. Operatory bitowe
Operatory bitowe działają na operandach jako 32-bitowy ciąg zer i jedynek i zwracają wartość liczbową wskazującą wynik operacji, zapisaną w notacji dziesiętnej. Operandy są liczbami całkowitymi, część ułamkowa argument jest odrzucany. Operacje bitowe mogą być używane na przykład podczas szyfrowania danych, pracy z flagami i ograniczania praw dostępu.
Operator/operacja | Opis | Priorytet |
---|---|---|
& Bitowe AND | Jeśli oba bity mają wartość 1 , wynikowy bit będzie równy 1 . W przeciwnym razie wynik to 0 . | 8 |
| Bitowe OR | Jeśli jeden z argumentów zawiera 1 na pozycji, wynik będzie również zawierał 1 na tej pozycji, w przeciwnym razie wynik na tej pozycji będzie wynosił 0 . | 6 |
^ XOR | Jeśli jedna i tylko jedna wartość zawiera 1 na dowolnej pozycji, wynik będzie zawierał 1 na tej pozycji, w przeciwnym razie wynik na tej pozycji będzie wynosił 0 . | 7 |
~ Odmowa | Operacja negacji bitowej jest wykonywana na binarnej reprezentacji wartości wyrażenia. Każda pozycja zawierająca 1 w oryginalnym wyrażeniu jest zastępowana przez 0 . Każda pozycja zawierająca 0 w oryginalnym wyrażeniu staje się 0 . Liczby dodatnie zaczynają się od 0 , liczby ujemne zaczynają się od -1 , więc ~ n == -(n+1) . | 14 |
Operator przesuwa bity pierwszego operandu w lewo o liczbę pozycji bitowych ustanowiony przez drugi argument. Zera są używane do wypełniania pozycji po prawej stronie. Zwróć wynik tego samego typu co lewy operand. | 11 | |
>> Przesunięcie bitowe w prawo | Operator przesuwa bity pierwszego operandu w prawo o liczbę pozycji bitowych ustawioną przez drugi operand. Cyfry, które są poza zakresem, są usuwane. Najbardziej znaczący bit (32.) pozostaje niezmieniony, aby zachować znak wyniku. Jeśli pierwszy operand jest dodatni, wyższe bity wyniku są wypełniane zerami; jeśli pierwszy operand jest ujemny, wyższe bity wyniku są wypełniane jedynkami. Przesunięcie wartości w prawo o jedną pozycję jest równoznaczne z dzieleniem przez 2 (z resztą odrzuconą), przesunięcie w prawo o dwie pozycje jest równoznaczne z dzieleniem przez 4 i tak dalej. | 11 |
>>> Bitowe przesunięcie w prawo bez znaku | Operator przesuwa bity pierwszego operandu w prawo o liczbę pozycji bitowych ustawioną przez drugi operand. Zera są dodawane po lewej stronie niezależnie od znaku pierwszego operandu. Cyfry, które są poza zakresem, są usuwane. | 11 |
7. Operatorzy strun
Istnieje kilka operatorów, które operują na ciągach w specjalny sposób.
„1” + „10”; // zwróci "110" "1" + 10; // zwraca "110" 2 + 5 + "kolorowe kredki"; // zwraca "7 kredek" "Kolorowych kredek" + 2 + 5; // zwraca "Kolorowe kredki 25" "1" > "10"; // zwróci fałszywe "10"<= 10; // вернет true "СССР" == "ссср"; // вернет false x = "micro"; x+= "soft"; // вернет "microsoft"8. Operatorzy specjalni
Operator/operacja | Opis | Priorytet |
---|---|---|
. Dostęp do nieruchomości | Uzyskuje dostęp do właściwości obiektu. | 15 |
, Wiele obliczeń | Oblicza wiele niezależnych wyrażeń zapisanych w jednym wierszu. | 1 |
Indeksowanie tablicy | Uzyskuje dostęp do elementów tablicy lub właściwości obiektów. | 15 |
() Wywołanie funkcji, grupowanie | Grupuje operacje lub wywołuje funkcję. | 15 |
typeof Definicja typu danych | Operator jednoargumentowy zwraca typ danych operandu. | 14 |
instanceof Sprawdź typ obiektu | Operator sprawdza, czy obiekt jest instancją określonej klasy. Lewy operand musi być obiektem, prawy operand musi zawierać nazwę klasy obiektu. Wynik będzie prawdziwy, jeśli obiekt określony po lewej stronie jest instancją klasy określonej po prawej stronie, w przeciwnym razie będzie fałszem. | 10 |
w Sprawdzanie, czy nieruchomość istnieje | Lewy operand musi być łańcuchem, a prawy operand musi być tablicą lub obiektem. Jeśli lewa wartość jest właściwością obiektu, wynikiem będzie true . | 10 |
tworzenie nowego obiektu | Operator tworzy nowy obiekt o niezdefiniowanych właściwościach, a następnie wywołuje funkcję konstruktora, aby go zainicjować (przekazać parametry). Może być również używany do tworzenia tablicy. | 1 |
kasować | Operator umożliwia usunięcie właściwości z obiektu lub elementu z tablicy. Zwraca true, jeśli usunięcie się powiodło, w przeciwnym razie false. Po usunięciu elementu tablicy jego długość się nie zmienia. | 14 |
void Definiowanie wyrażenia bez zwracanej wartości | Operator jednoargumentowy, odrzuca wartość operandu i zwraca underfined . | 14 |
?: Operacja na wyrażeniach warunkowych | Operator trójskładnikowy pozwala organizować proste rozgałęzienia. W wyrażeniu występują trzy operandy, pierwszy musi być wartością logiczną lub być na nią przekonwertowany, a drugi i trzeci muszą być dowolnymi wartościami. Jeśli pierwszy operand ma wartość true , wyrażenie warunkowe przyjmie wartość drugiego operandu; jeśli fałszywy - to trzeci. | 3 |
9. Komentarze w JavaScript
Komentarz jednowierszowy: poprzedź tekst komentarza znakami //.
Jako obiekt C, funkcja musi być zadeklarowana. Deklaracja funkcji użytkownika, tj. jego deklaracja odbywa się w dwóch formach - w formie opisu oraz w formie definicji.
Opis funkcji to pierwsze rzucenie plik programu jej prototyp. Prototyp funkcji informuje kompilator, że w dalszej części tekstu programu zostanie podana jej pełna definicja (jej pełny tekst): w bieżącym lub innym pliku kod źródłowy lub jest w bibliotece.
Standard językowy wykorzystuje następujący sposób deklarowania funkcji:
typ_wyniku ID _functions(zmienna typ1, …, zmienna typ N);
Zauważ, że nie jest konieczne podawanie identyfikatorów zmiennych w nawiasach prototypu, ponieważ kompilator języka ich nie przetwarza.
Deklaracja prototypu umożliwia kompilatorowi sprawdzenie, czy typy i liczba parametrów są zgodne, gdy funkcja jest faktycznie wywoływana.
Przykładowy opis funkcji fun z listą parametrów:
float fun(int, float, int, int);
Pełna definicja funkcji wygląda tak:
typ_wyniku ID _functions(lista parametrów)
kod funkcji
Typ wyniku określa typ wyrażenia, którego wartość jest zwracana do punktu jego wywołania za pomocą operatora zwrócić<выражение> .
Jeśli typ funkcji nie jest określony, przyjmowany jest typ domyślny. int .
Lista parametrów składa się z listy typów i identyfikatorów parametrów oddzielonych przecinkami.
Funkcja może nie mieć parametrów, ale nawiasy i tak są wymagane.
Jeśli funkcja nie zwraca żadnej wartości, musi być zadeklarowana jako funkcja typu próżnia (pusty).
W takim przypadku operator zwrócić nie można ustawić.
Funkcja może mieć wiele operatorów. zwrócić , ale może ich nie być. W takich przypadkach powrót do programu wywołującego następuje po wykonaniu ostatniej instrukcji w funkcji.
Przykład funkcji określającej najmniejszą wartość dwóch zmiennych całkowitych:
int min (int x, int y)
powrót(x
Wszystkie funkcje zwracające wartość muszą być używane po prawej stronie wyrażeń języka C, w przeciwnym razie zwracany wynik zostanie utracony.
Jeżeli funkcja nie posiada listy parametrów, to przy deklarowaniu takiej funkcji wskazane jest również wskazanie słowa kluczowego void w nawiasach. Na przykład, nieważne główne (nieważne).