TypeScript - funkcje
Funkcje są elementami składowymi kodu czytelnego, możliwego do utrzymania i wielokrotnego użytku. Funkcja to zestaw instrukcji służących do wykonania określonego zadania. Funkcje organizują program w logiczne bloki kodu. Po zdefiniowaniu funkcji można wywołać kod dostępu. Dzięki temu kod można ponownie wykorzystać. Ponadto funkcje ułatwiają odczytywanie i obsługę kodu programu.
Deklaracja funkcji informuje kompilator o nazwie funkcji, typie zwracanym i parametrach. Definicja funkcji zawiera rzeczywistą treść funkcji.
Sr.No | Funkcje i opis |
---|---|
1. | Definiowanie funkcji Definicja funkcji określa, co i jak zostanie wykonane określone zadanie. |
2. | Wywołanie funkcji Funkcja musi zostać wywołana, aby ją wykonać. |
3. | Funkcje powracające Funkcje mogą również zwracać wartość wraz z kontrolą, z powrotem do obiektu wywołującego. |
4. | Funkcja sparametryzowana Parametry to mechanizm przekazywania wartości do funkcji. |
Parametry opcjonalne
Parametry opcjonalne mogą być używane, gdy argumenty nie muszą być obowiązkowo przekazywane w celu wykonania funkcji. Parametr można oznaczyć jako opcjonalny, dołączając znak zapytania do jego nazwy. Opcjonalny parametr należy ustawić jako ostatni argument funkcji. Składnia deklarowania funkcji z opcjonalnym parametrem jest taka, jak podano poniżej -
function function_name (param1[:type], param2[:type], param3[:type])
Przykład: parametry opcjonalne
function disp_details(id:number,name:string,mail_id?:string) {
console.log("ID:", id);
console.log("Name",name);
if(mail_id!=undefined)
console.log("Email Id",mail_id);
}
disp_details(123,"John");
disp_details(111,"mary","[email protected]");
Powyższy przykład deklaruje sparametryzowaną funkcję. Tutaj trzeci parametr, tj. Mail_id, jest parametrem opcjonalnym.
Jeśli opcjonalny parametr nie zostanie przekazany jako wartość podczas wywołania funkcji, wartość parametru jest ustawiana na niezdefiniowaną.
Funkcja drukuje wartość mail_id tylko wtedy, gdy do argumentu została przekazana wartość.
Podczas kompilacji wygeneruje następujący kod JavaScript -
//Generated by typescript 1.8.10
function disp_details(id, name, mail_id) {
console.log("ID:", id);
console.log("Name", name);
if (mail_id != undefined)
console.log("Email Id", mail_id);
}
disp_details(123, "John");
disp_details(111, "mary", "[email protected]");
Powyższy kod wygeneruje następujący wynik -
ID:123
Name John
ID: 111
Name mary
Email Id [email protected]
Parametry odpoczynku
Pozostałe parametry są podobne do zmiennych argumentów w Javie. Pozostałe parametry nie ograniczają liczby wartości, które można przekazać do funkcji. Jednak wszystkie przekazywane wartości muszą być tego samego typu. Innymi słowy, parametry reszty działają jako symbole zastępcze dla wielu argumentów tego samego typu.
Aby zadeklarować parametr rest, nazwa parametru jest poprzedzona trzema kropkami. Każdy parametr nonrest powinien znajdować się przed parametrem rest.
Przykład: parametry odpoczynku
function addNumbers(...nums:number[]) {
var i;
var sum:number = 0;
for(i = 0;i<nums.length;i++) {
sum = sum + nums[i];
}
console.log("sum of the numbers",sum)
}
addNumbers(1,2,3)
addNumbers(10,10,10,10,10)
Deklaracja funkcji addNumbers () przyjmuje resztę parametru nums . Typ danych pozostałego parametru musi być ustawiony na tablicę. Ponadto funkcja może mieć co najwyżej jeden parametr odpoczynku.
Funkcja jest wywoływana dwukrotnie, przekazując odpowiednio trzy i sześć wartości.
Pętla for wykonuje iterację po liście argumentów, przekazywanych do funkcji i oblicza ich sumę.
Podczas kompilacji wygeneruje następujący kod JavaScript -
function addNumbers() {
var nums = [];
for (var _i = 0; _i < arguments.length; _i++) {
nums[_i - 0] = arguments[_i];
}
var i;
var sum = 0;
for (i = 0; i < nums.length; i++) {
sum = sum + nums[i];
}
console.log("sum of the numbers", sum);
}
addNumbers(1, 2, 3);
addNumbers(10, 10, 10, 10, 10);
Dane wyjściowe powyższego kodu są następujące -
sum of numbers 6
sum of numbers 50
Parametry domyślne
Domyślnie parametrom funkcji można również przypisać wartości. Jednak takie parametry mogą być również jawnie przekazywane wartości.
Składnia
function function_name(param1[:type],param2[:type] = default_value) {
}
Note - Nie można jednocześnie zadeklarować parametru jako opcjonalnego i domyślnego.
Przykład: parametry domyślne
function calculate_discount(price:number,rate:number = 0.50) {
var discount = price * rate;
console.log("Discount Amount: ",discount);
}
calculate_discount(1000)
calculate_discount(1000,0.30)
Podczas kompilacji wygeneruje następujący kod JavaScript -
//Generated by typescript 1.8.10
function calculate_discount(price, rate) {
if (rate === void 0) { rate = 0.50; }
var discount = price * rate;
console.log("Discount Amount: ", discount);
}
calculate_discount(1000);
calculate_discount(1000, 0.30);
Jego wynik jest następujący -
Discount amount : 500
Discount amount : 300
W przykładzie zadeklarowano funkcję oblicz_dskonto . Funkcja ma dwa parametry - cenę i stawkę.
Wartość współczynnika parametru jest domyślnie ustawiona na 0,50 .
Program wywołuje funkcję, przekazując do niej jedynie wartość parametru price. Tutaj wartość stawki wynosi 0,50 (domyślnie)
Wywoływana jest ta sama funkcja, ale z dwoma argumentami. Domyślna wartość stawki jest nadpisywana i ustawiana na wartość jawnie przekazaną.
Funkcja anonimowa
Funkcje, które nie są powiązane z identyfikatorem (nazwą funkcji), są nazywane jako anonymous functions. Te funkcje są dynamicznie deklarowane w czasie wykonywania. Funkcje anonimowe mogą przyjmować dane wejściowe i zwracane dane wyjściowe, tak jak robią to funkcje standardowe. Funkcja anonimowa jest zwykle niedostępna po jej początkowym utworzeniu.
Zmiennym można przypisać funkcję anonimową. Takie wyrażenie nazywa się wyrażeniem funkcyjnym.
Składnia
var res = function( [arguments] ) { ... }
Przykład ─ Prosta funkcja anonimowa
var msg = function() {
return "hello world";
}
console.log(msg())
Podczas kompilacji wygeneruje ten sam kod w JavaScript.
Wytworzy następujący wynik -
hello world
Przykład ─ Funkcja anonimowa z parametrami
var res = function(a:number,b:number) {
return a*b;
};
console.log(res(12,2))
Funkcja anonimowa zwraca iloczyn przekazanych do niej wartości.
Podczas kompilacji wygeneruje następujący kod JavaScript -
//Generated by typescript 1.8.10
var res = function (a, b) {
return a * b;
};
console.log(res(12, 2));
Dane wyjściowe powyższego kodu są następujące -
24
Wyrażenie funkcji i deklaracja funkcji ─ Czy są synonimami?
Wyrażenie funkcji i deklaracja funkcji nie są synonimami. W przeciwieństwie do wyrażenia funkcji deklaracja funkcji jest powiązana z nazwą funkcji.
Podstawowa różnica między nimi polega na tym, że deklaracje funkcji są analizowane przed ich wykonaniem. Z drugiej strony, wyrażenia funkcyjne są analizowane tylko wtedy, gdy silnik skryptów napotka je podczas wykonywania.
Gdy parser JavaScript widzi funkcję w głównym przepływie kodu, przyjmuje deklarację funkcji. Kiedy funkcja jest częścią instrukcji, jest wyrażeniem funkcji.
Konstruktor funkcji
TypeScript obsługuje również definiowanie funkcji za pomocą wbudowanego konstruktora JavaScript o nazwie Function ().
Składnia
var res = new Function( [arguments] ) { ... }.
Przykład
var myFunction = new Function("a", "b", "return a * b");
var x = myFunction(4, 3);
console.log(x);
Nowa funkcja () jest wywołaniem konstruktora, który z kolei tworzy i zwraca odwołanie do funkcji.
Podczas kompilacji wygeneruje ten sam kod w JavaScript.
Dane wyjściowe powyższego przykładowego kodu są następujące -
12
Funkcje rekurencyjne i TypeScript
Rekurencja to technika iterowania operacji poprzez wielokrotne wywoływanie funkcji do siebie, aż do uzyskania wyniku. Rekurencję najlepiej stosować, gdy trzeba wielokrotnie wywoływać tę samą funkcję z różnymi parametrami w obrębie pętli.
Przykład - rekurencja
function factorial(number) {
if (number <= 0) { // termination case
return 1;
} else {
return (number * factorial(number - 1)); // function invokes itself
}
};
console.log(factorial(6)); // outputs 720
Podczas kompilacji wygeneruje ten sam kod w JavaScript.
Oto jego wynik -
720
Przykład: anonimowa funkcja rekurencyjna
(function () {
var x = "Hello!!";
console.log(x)
})() // the function invokes itself using a pair of parentheses ()
Podczas kompilacji wygeneruje ten sam kod w JavaScript.
Jego wynik jest następujący -
Hello!!
Funkcje lambda
Lambda odnosi się do anonimowych funkcji w programowaniu. Funkcje lambda to zwięzły mechanizm reprezentujący funkcje anonimowe. Te funkcje są również nazywane jakoArrow functions.
Funkcja lambda - anatomia
Istnieją 3 części funkcji Lambda -
Parameters - Funkcja może opcjonalnie mieć parametry
The fat arrow notation/lambda notation (=>) - Nazywa się to również jako idzie do operatora
Statements - reprezentują zestaw instrukcji funkcji
Tip - Zgodnie z konwencją, w przypadku zwartej i precyzyjnej deklaracji funkcji zachęca się do używania parametru jednoliterowego.
Wyrażenie lambda
Jest to anonimowe wyrażenie funkcyjne, które wskazuje na pojedynczy wiersz kodu. Jego składnia jest następująca -
( [param1, parma2,…param n] )=>statement;
Przykład: wyrażenie lambda
var foo = (x:number)=>10 + x
console.log(foo(100)) //outputs 110
Program deklaruje funkcję wyrażenia lambda. Funkcja zwraca sumę 10 i przekazanego argumentu.
Podczas kompilacji wygeneruje następujący kod JavaScript.
//Generated by typescript 1.8.10
var foo = function (x) { return 10 + x; };
console.log(foo(100)); //outputs 110
Oto wynik powyższego kodu -
110
Instrukcja Lambda
Instrukcja lambda to anonimowa deklaracja funkcji, która wskazuje na blok kodu. Ta składnia jest używana, gdy treść funkcji obejmuje wiele wierszy. Jego składnia jest następująca -
( [param1, parma2,…param n] )=> {
//code block
}
Przykład: instrukcja Lambda
var foo = (x:number)=> {
x = 10 + x
console.log(x)
}
foo(100)
Odwołanie do funkcji jest zwracane i przechowywane w zmiennej foo.
Podczas kompilacji wygeneruje następujący kod JavaScript -
//Generated by typescript 1.8.10
var foo = function (x) {
x = 10 + x;
console.log(x);
};
foo(100);
Wynik powyższego programu jest następujący -
110
Wariacje syntaktyczne
Wnioskowanie o typie parametru
Określenie typu danych parametru nie jest obowiązkowe. W takim przypadku typ danych parametru jest dowolny. Rzućmy okiem na następujący fragment kodu -
var func = (x)=> {
if(typeof x=="number") {
console.log(x+" is numeric")
} else if(typeof x=="string") {
console.log(x+" is a string")
}
}
func(12)
func("Tom")
Podczas kompilacji wygeneruje następujący kod JavaScript -
//Generated by typescript 1.8.10
var func = function (x) {
if (typeof x == "number") {
console.log(x + " is numeric");
} else if (typeof x == "string") {
console.log(x + " is a string");
}
};
func(12);
func("Tom");
Jego wynik jest następujący -
12 is numeric
Tom is a string
Opcjonalne nawiasy dla pojedynczego parametru
var display = x=> {
console.log("The function got "+x)
}
display(12)
Podczas kompilacji wygeneruje następujący kod JavaScript -
//Generated by typescript 1.8.10
var display = function (x) {
console.log("The function got " + x);
};
display(12);
Jego wynik jest następujący -
The function got 12
Opcjonalne nawiasy klamrowe dla pojedynczej instrukcji. Puste nawiasy bez parametru
Poniższy przykład przedstawia te dwie odmiany syntaktyczne.
var disp =()=> {
console.log("Function invoked");
}
disp();
Podczas kompilacji wygeneruje następujący kod JavaScript -
//Generated by typescript 1.8.10
var disp = function () {
console.log("Function invoked");
};
disp();
Jego wynik jest następujący -
Function invoked
Przeciążenia funkcji
Funkcje mogą działać w różny sposób na podstawie dostarczonych im danych wejściowych. Innymi słowy, program może mieć wiele metod o tej samej nazwie i różnej implementacji. Ten mechanizm jest określany jako przeciążanie funkcji. TypeScript zapewnia obsługę przeciążania funkcji.
Aby przeciążać funkcję w TypeScript, musisz wykonać kroki podane poniżej -
Step 1- Zadeklaruj wiele funkcji o tej samej nazwie, ale różnej sygnaturze funkcji. Podpis funkcji obejmuje następujące elementy.
The data type of the parameter
function disp(string):void;
function disp(number):void;
The number of parameters
function disp(n1:number):void;
function disp(x:number,y:number):void;
The sequence of parameters
function disp(n1:number,s1:string):void;
function disp(s:string,n:number):void;
Note - Podpis funkcji nie zawiera zwracanego typu funkcji.
Step 2- Po deklaracji musi następować definicja funkcji. Typy parametrów powinny być ustawione naanyjeśli typy parametrów różnią się podczas przeciążenia. Dodatkowo dlacase b wyjaśniono powyżej, możesz rozważyć oznaczenie jednego lub więcej parametrów jako opcjonalnych podczas definiowania funkcji.
Step 3 - Na koniec musisz wywołać funkcję, aby działała.
Przykład
Przyjrzyjmy się teraz poniższemu przykładowemu kodowi -
function disp(s1:string):void;
function disp(n1:number,s1:string):void;
function disp(x:any,y?:any):void {
console.log(x);
console.log(y);
}
disp("abc")
disp(1,"xyz");
Pierwsze dwa wiersze przedstawiają deklarację przeciążenia funkcji. Funkcja ma dwa przeciążenia -
Funkcja, która akceptuje pojedynczy parametr ciągu.
Funkcja, która akceptuje dwie wartości odpowiednio typu liczba i łańcuch.
Trzecia linia definiuje funkcję. Ustawiono typ danych parametrówany. Ponadto drugi parametr jest tutaj opcjonalny.
Przeciążona funkcja jest wywoływana przez dwie ostatnie instrukcje.
Podczas kompilacji wygeneruje następujący kod JavaScript -
//Generated by typescript 1.8.10
function disp(x, y) {
console.log(x);
console.log(y);
}
disp("abc");
disp(1, "xyz");
Powyższy kod wygeneruje następujący wynik -
abc
1
xyz