let a = "1";
let b = 0;
switch (+ a) {
case b + 1:
alert ("bu işləyəcəkdir. Çünkü + a 1, təxmini olaraq b + 1 -ə bərabərdir");
break;
default:
alert ("İşləmədikdə işə düşəcək hissə");
}
120
“Case” qruplaşdırılması
Bir şərt bir necə case aid olduqda qruplaşdırmadan istifadə edə bilərik.
Nümunə olaraq 3 və 5 ci case-ləri qruplaşdırmağa çalışaq:
İndi həm 3 həm də 5 dəki kod hissəciyini göstərir.
Qruplaşdırılması case-lərdə breakla işlətmək olmur. Bu onun mənfi
cəhətidir. Buna görə də dayanmadan şərtləri yoxlamadan keçirəcəkdir.
let a = 2 + 2;
switch (a) {
case 4:
alert ( 'Doğru!');
break;
case 3: // (*) iki case qruplaşdırıldı
durum 5:
alert ( 'Səhvdir!') ;
alert ("Niyə riyaziyyat öyrənəməyə başlamırsan?");
break;
default:
alert ('Nəticə bilinmir.');
}
121
Tip uyğunlaşdırılması
Bərabərlik yoxlanılması hər zaman vacibdir. Dəyərlərin uyğunlaşdırılması
üçün eyni tipdə olmalıdır.
Məsələn aşağıdakı koda baxaq:
1. 0, 1 üçün ilk alert işə düşür.
let arg = prompt ("Bir dəyər yazın?");
switch (arg) {
case '0':
case 1':
alert ('Bir vəya sıfır');
break;
case '2':
alert ('İki');
break;
case 3:
alert (İşə düşməyəcəkdir!');
break;
default:
alert ('Bilinməyən dəyər');
}
122
2. 2 üçün ikinci alert işə düşür.
3. Ancaq 3 yazıldıqda 3===”3” -ə barəbarə deyildir. Yəni case 3-də kod
hissəciyi işə düşməyəcəkdir. Defaut dəyəri işə düşəcəkdir.
123
18. Funksiyalar
Çox zaman kodun hər hansı bir hissəsində oxşar olan kod hissəcikləri
yazmaq lazım olur. Məsələn istifadəçi hesabına daxil olduqda, çıxdıqda və
başqa yerdə oxşar olan mesajı göstərmək lazım ola bilər.
Funksiyalar proqramlaşdırmanın əsas hissəsidir. Kodun təkrar edilmədən bir
necə dəfə çağırılmasına imkan verir.
Alert(mesaj), prompt(mesaj, default) və confirm (sual) nümunələrinə baxdıq.
Ancaq öz istədiyimizə görə də funksiyalar yaza bilərik.
Funksiya yaradılması
Funksiya yaratmaq üçün function ifadəsindən istifadə edirik.
Aşağıdakı şəkildə yazılır:
Funksiyalarda açar sözlər əvvəldə yazılır. Sonra funksiyanın adı, ondan sonra
mörtərizə içərisinə (yuxarıdakı kimi boş olan) parametrlər yazılır və skoplar
arasında işləyəcək kod hissəciyi qeyd olunur.
Yeni yaradılmış funksiyamız adı ilə çağırıla bilər : gosterMesaj() .
Nümunə:
function gosterMesaji () {
alert ('Hamıya Salam!');
}
124
gosterMesaj () çağrılması ilə kod işə düşəcəkdir. Burada mesajı iki dəfə
görəcəyik.
Bu nümunə funksiyaların əsas məqsədlərindən birinin izahıdır: kod
təkrarlanmasının qarşısının alınması.
Mesajı vəya göstərilmə şəklini dəyişdirmək lazım olarsa, kodu tək bir yerdə
dəyişdirmək yetərlidir.
Daxili dəyişənlər
Funksiyanın içərisində bildirilmiş dəyişən sadəcə o funksiyanın içərisində
görülür.
Nümunə:
function gosterMesaj () {
alert ('Hamıya Salam!');
}
gosterMesaj ();
gosterMesaj ();
function gosterMesaj () {
let mesaj = "Salam, JavaScript-əm!"; // local dəyişən
alert mesajı );
}
gosterMesaj (); // Salam, JavaScript-əm!
alert (mesaj ); // <- Xəta! Dəyişən localda yerləşdirilmişdir
125
Qlobal dəyişənlər
Funksiya global dəyişənlərdən istifadə edə bilir:
Funksiyalar global dəyişənlərə tam olaraq təsir göstərə bilir. Onları dəyişdirə
bilirlər. Məsələn :
let userName = 'Nail';
function gosterMesaj () {
let mesaj = 'Salam,' + userName;
alert (mesaj);
}
gosterMesaj (); // Salam Nail
userName = 'Nail';
function gosterMesaj () {
userName = "Elmar"; // (1) global dəyişən dəyişdirildi
let mesaj = 'Salam,' + userName;
alert (mesaj);
}
alert (userName); // Funksiya çağırılmamışdan əvvəl Nail idi
gosterMesaj ();
alert (userName); // Elmar, dəyər funksiya tərəfindən
dəyişdirildi.
126
Global dəyişən lokalda yalnız bir dəfər istifadə edilir.
Funksiyaların içərisində eyni adlı dəyişən olarsa, global dəyişən nəzərə
alınmayacaqdır. Məsələn aşağıdakı kodda funksiya lokal userName adlı
dəyişən istifadə edir. Global dəyişəni nəzərə almıyacaqdır:
Global dəyişənlər
Yuxarıdakı kodda global istifadəci adı kimi hər hansı funksiyadan kənarda
bildirilmiş dəyişənlərə qlobal dəyişənlər deyilir.
Ümumi dəyişənlər hər hansı funksiyada görə bilərsiniz (lokal dəyişənlər
tərəfindən təsir göstərilməzsə)
Global dəyişənlərin istifadəsini ən aza endirmək yaxşı kod yazılışıdır.
userName = 'Nail';
function gosterMesaj () {
let userName = "Elmar"; // Lokal dəyər bildirildi.
let mesaj = 'Salam,' + userName; // Elmar
alert (mesajı);
}
// funksiya özünün userName-ni istifadə edəcəkdir
gosterMesaj ();
alert (userName); // Nail, dəyişmədi. Funksiya global dəyişəni nəzərə
almadı.
127
Müasir kod strukturlarında çox az qlobal dəyişənlər var və yaxud bəzilərində
heç yoxdur. Çox dəyişənlər funksiayaların tərkibində olur. Bəzən də
layihədəki məlumatları saxlamaq üçün yaxşıdır.
Parametrlər
Parametrlərdən istifadə edərək funksiayalara istənilən dəyər verə bilərik
(bunlara funksiya arqumentləri deyilir).
Aşağıdakı nümunədə funksiyanın iki parametri var : from və text.
Funksiyalarda (*) və (**) yazılan parametrlərə verilmiş dəyərlər lokal
dəyişənlərə ötürülür. Funksiya işlədikdə isə onlar çağırılır.
Daha bir nümunə: dəyişənimiz var və onu funksiyaya əlavə edirik. Diqqət
edin funksiya dəyişəcəkdir. Ancaq dəyişiklik görülməyəcəkdir. Çünki hər
zaman funksiya dəyərin nüsxəsini alır:
function gosterMesaj (from, text) {// argumentlər: from, metin
alert (from +':' + text);
}
gosterMesaj ('Nail', 'Salam'); // Nail: Salam (*)
gosterMesaj ('Elmar', "Necəsən?"); // Nail: Necəsən? (**)
128
Default (İlkin) dəyərlər
Heç bir parametrin uyğun gəlmədiyi halda default dəyər işə düşür. Məsələn
yuxarıda göstərilmiş funksiya gosterMesaj(from, text) tək arqumentlə çağırılır:
gosterMesaj ( "Nail");
Bu səhv deyildir. Belə çağrılmalarda “Nail: undefined” ilə nəticələnəcəkdir.
Text olmadığı üçün text===undefined olduğunu zənn edir. Text heç bir
dəyər verməyərək istifadə etmək istəyiriksə, textdən sonra = yazmalıyıq:
function gosterMesaj (from, text) {
from = '*' + from + '*'; // "from" dan daha görünməyə kömək edir.
alert (from+ ':' + text);
}
let from = "Nail";
gosterMesaj (from," Salam "); // * Nail *: Salam
// "from" dəyəri eynidir. Funksiyal lokal dəyişəni dəyişmişdir.
alert (from); // Nail
function gosterMesaj (from, text = " yazı yoxdur") {
alert (from + ': "+ text);
}
gosterMesaj ( "Nail"); // Nail: yazı yoxdur.
129
İndi əgər text parametrinə heç bir dəyər verilməzsə “yazı yoxdur” dəyərini
alacaqdır. Burada verilmiş nümunədə string olaraq verilmişdir. Bunun daha
mürəkkən ifadəsi ilə qarşılaşa bilərsiniz. Yəni aşağıdakı kimi də mümkündür:
Default parametrlərdən istifadə
Javascriptdə funksiya hər dəfə çağırıldıqda əlaqəli olan parametr olmadıqda
default parametr işə düşür. Yuxarıdakı nümunədə hər parametrə gosterMesaj
() -də text parametrinin dəyəri olmadıqda başqa bir funksiya işə düşür.
Default dəyər 1 ədəd olur. Python kimi dillərin əksinə olaraq.
Default parametrlər köhnə formada istifadəsi
Əvvəlki Javascript versiyalarında default dəyərlər dəstəklənmirdi. Bu səbəblə
onları əvvəlki formada istifadə edərək dəstəklənməsinə nail ola bilərsiniz.
Məsələn undefined olmağının yoxlanması:
function gosterMesaj (from, text = anotherFunction ()) {
// anotherFunction () yalnız text olmaz işləyəcəkdir
// dəyər sonuncu yazılmış dəyərə bərabər olacaqdır
}
130
Geriyə dəyər ötürmə prosesi
Funksiya nəticə olaraq geriyə bir dəyər ötürməlidir.
Ən sadə nümunə iki dəyərin toplanmasına adi funksiya olacaqdır:
function gosterMesaj (from, text) {
if (text === undefined) {
text = 'yazı yoxdur';
}
alert (from+ “: “+ text);
}
… Vəya || operatoru:
function gosterMesaj (form,text) {
// if əgər səhv dəyər alarsa, “undefined” dəyərini alacaqdır.
text = text || 'yazı yoxdur';
...
}
function cem (a, b) {
return a + b;
}
let result = cem (1, 2);
alert (netice); // 3
131
Geriyə dəyər ötürmə (Return) funksiyanın hər yerində ola bilər. Funksiya
bitdikdə proses dayanır və dəyər geri ötürülür. (Yuxarıdakı nümunə kimi
olacaqdır.)
Tək funksiyada bir neçə geri dəyər ötürülməsi ola bilər. Nümunə:
funksiya checkAge (yaş) {
if (yaş> 18) {
return true;
} else {
return confirm ('Ailenizden izniniz var mı?');
}
}
let age = prompt ('Neçə yaşınız var?', 18);
if (checkAge (yaş)) {
alert ('İcazə verildi');
} else {
alert ('İcazə verilmədi');
}
132
Return olmadanda dəyər almaq mümkündür. Bu funksiyanın dərhal
çıxmasına səbəb olacaqdır.
Nümunə:
Yuxarıdakı kodda checkAge (yaş) səhv olarsa, ShowMovie-da alert-in
dayandırıldığına baxın.
Boş dəyər geri ötürlərsə, undefined dəyərini alacaqdır:
function showMovie (yaş) {
if (! checkAge (yaş)) {
return;
}
alert ("Film başladı"); // (*)
// ...
}
function doNothing () {/ * empty * /}
alert (doNothing () === undefined); // düzgün
Boş göndərilmiş dəyər undefined -a bərabərdir:
function doNothing () {
return;
}
alert (doNothing () === undefined); // düzgün
133
Return ilə dəyər arasında heç vaxt boş sətir qoymayın.
Uzun bir ifadə üçün aşağıdakı kimi yeni bir sətirə keçid etmək xoş görünə
bilər:
return
(bunun+kimi + uzun + ifadə + vəya + hər nə+olursa+olsun * f (a) + f (b))
Bu işə yaramıyacaqdır. Çünki Javascriptdə return-dən sonra nöqtəli vergül
qoyulmalıdır. Bu da təbbi ki, işləməyəcəkdir.
return;
(bunun+kimi + uzun + ifadə + vəya + hər nə+olursa+olsun * f (a) + f (b))
Beləcə gördüyünüz kimi boş dəyər alaraq geri döndü. Bunun düzəltmək üçün
return ilə dəyəri eyni sətirə qoymaq lazımdır.
Funksiya adlandırılması
Funksiyalar hərəkətdirlər. Yəni onların ümumilikdə fel adlanır. Mümkün
olduğu qədər adlandırılma düzgün olmalıdır və nə üçün yazıldığını izah
etməlidir. Beləliklə kodu oxuyan developer funksiyanın nə iş gördüyünü
anlayacaqdır.
134
Funksiya adlandırılmasında komandaların istifadə etdiklər prefikslər vardır.
Bunlardan istifadə etmək komanda daxilində işin asanlaşdırılmasına səbəb
olur.
Məsələn “show” ilə başlıyan funksiya ümumilikdə aşağıdakı fellərin prefiksi
ola bilər:
• "get…" - bir dəyər ver,
• "calc…" - bir şey hesabla,
• "creat ..." - bir şeyler yarat,
• "creat " - - bir şeyi yoxla və boolean dəyəri geri qaytar, vb.
Adlandırmaya əlavə nümunələr:
showMessage (..) // bir mesaj göstər
getAge (..) // yaşı ver
calcSum (..) // cəm hesablayır və nəticəni geri qaytarır
createForm (..) // form yaradır
checkPermission (..) // icazəni yoxlayır
Nümunələrin düzgün olması funksiyanın adına baxdıqda nə işə yaradığını
anlamaya imkan verir.
135
Bir funksiya – bir hərəkət
Hərəkətlər tam olaraq adındakı funksiyanı yerinə yetirməlidir. Daha çoxunu
istifadə etməməlidir.
İki hərəkəti yaradan funksiya olsa belə, ümumilikdə ortak funksiyalara görə
adlandırılmalıdır.
Bu qaydaların pozulmasına dair nümunələr :
• getAge – yaşla bağlı bildiriş göstərsə(sadəcə almalıdır), düzgün
olmayacaqdır.
• createForm – form dəyişərsə, özünə əlavə form əlavə edərsə düzgün
deyildir.
• checkPermission – qəbul mesajı görünərsə, sadəcə rədd mesajı olduqda
görünməlidir.
Bu nümunələr ortaq mənaları olanlar idi. Siz və komandanız digər mənalarda
üzərində çalışıb kombinasiya qurmaqda sərbətsiniz. Ama ümumilikdə çox da
fərqlənməyəcəkdir. Hər halda prepikslərin təyini və nə məna verdiyi yalnız
sizin komandaya aid olacaqdır. Bu adlandırılma bütün komanda üzvlərinə
izah edilməlidir.
Ultrashot funksiya adları
Çox istifadə edilən funksiyalar ultrashot adlarına sahibdirlər.
136
Məsələn jQuery frameworkündə $ ilə funksiyalar adlandırılır. Lodash
kitabxanasında _ ilə adlandırılır. Bunlar istisnalardır. Ümumi olaraq adlar
qısa və mənalı olmalıdır.
Funskiyalar == Şərhlər
Funksiyalar qısa olmalı və işə yarıyan olmalıdır. Əgər funskiyanız böyükdürsə
, onu kiçik funksiyalara bölmək sizə kömək ola bilər. Bəzən bu qaydaları
izləmək o qədər də asan olmaya bilər. Amma inanın ki, sizin üçün
sadələşməyə kömək edəcəkdir.
Funksiyanı test etmək və xəta tapmaq asan deyildir. Nümunə olaraq
aşağıdakı Primes(n) funksiyasını iki hissəyə ayrılmış funksiya ilə müqayisə
edək.
İlk dəyişən etiketdən istifadə edir:
function showPrimes (n)
nextPrime: for (let i = = 2; i for (let j = 2; j if (i% j == 0) continue nextPrime;
}
alert (i); // prime
}
}
137
İkinci dəyişəni test etmək üçün əlavə funksiya olan isPrime (n) istifadə edilir:
İkinci dəyişənin başa düşülməsi sadədir. Kod hissəsi yerinə funksiyanın nə
işə yaradığını görürük (isPrime). Bəzən insanlar öz özlərini izah edən kodlara
istinat edirlər.
Beləliklə onları yenidən istifadə etdikdə heç bir çətinliyimiz olmayacaqdır.
function showPrimes (n)
for(i = 2; i if (! isPrime (i)) continue;
alert (i) // prime
}
}
function isPrime (n) {
for (i = 2; i if (n% i == 0) return false;
}
return true;
}
138
Nəticə
Funksiyanın strukturu belə görünəcədir:
• Parametrler lokal dəyişənlərinə ötürülərkən işə düşən dəyərlərdir.
• Funksiya global dəyişənlərdən istifadə edə bilər. Ancaq sadəcə içəridən
çölə doğru işləyəcəkdir. Funksiyanın kənarında lokal dəyişənlər
görünməyəcəkdir.
• Funksiyalar dəyər ötürə bilirlər. Olmazsa, undefined alır.
Kodu təmiz və başa düşülən hala salmaq üçün funksiyada qlobal dəyişənləri
yerinə lokal dəyişənlərdən istifadə etməyiniz məsləhətdir.
Parametrləri olan, bunlarla işləyən və nəticəni geri qaytaran funksiya hər
zaman sadə deyildir. Ancaq qlobal dəyişənlər əlavə təsir göstərir.
Funksiyaların adlandırılması:
• Ad funksiyanın nə işə yaradığını izah etməlidir. Kodda funksiya
çağırıldığını gördükdə nəyin baş verdiyini anlamağımıza kömək edir.
Funksiya hərəkətdir. Bu səbəblə funksiya adları ümumilikdə fellərdən olur.
function adı (parametr, saysız,vergüllə ayrılmış,)
{
/ * kod * /
}
139
Create…, show…, get…, check… və bunlar kimi bir çox tanınmış funksiya
adları vardır. Bu funksiyanın nə işə yaradığını göstərmək üçün istifadə edilir.
Funksiyalar görülən işin əsas hissəsidir. İndi sadə formada başa düşdük.
Əslində onları artıq yaradıb və istifadə edə bilərik. Amma bu sadəcə yolun
başlanğıcıdır. Funksiyalara daha sonra yenidən qayıdacıq. Dərin
xüsusiyyətlərinə baxacıq.
140
19. Expression funksiyaları və oxlar
Javascriptdə funksiya “sehirli dil strukturu” deyildir. Sadəcə xüsusi dəyərdir.
Daha əvvəl istifadə etdiyimiz sintaksis ilə funksiyamızı çağıraq :
Funksiya sintaksisinin fərqli yazı tipi vardır. Nümunə:
Burada funksiya digər hər hansı dəyər kimi yaradılır və dəyişənə verilir.
Funksiyanın tipi vacib deyildir. Sadəcə salamDe dəyişəninin olduğu dəyərdir.
Bu kod nümunələrinin ikisidə eynidir.
Bu dəyəri bildiriş kimi çağıraq:
function salamDe () {
alert ("Salam");
}
let salamDe = function () {
alert ("Salam ");
};
function salamDe () {
alert ("Salam ");
}
alert (salamDe); // funksiyada olan kod
hissəciyi işə düşəcəkdir.
141
Son sətrin işləmədiyini yadda saxlayın, çünki salamDe-dən sonra skop
yoxdur.
Javascriptdə funksiyanın dəyərdir. Bu səbəblə onunla tip kimi davrana bilərik.
Təbii ki, salamDe() kimi adlandırılan xüsusi dəyərdir.
Ama bu hələ də bir dəyərdir. Beləliklə digər dəyərlərdə olduğu kimi onunlada
işləyə bilərik. Funksiyanı dəyişənlə istifadə edək:
Yuxarıdakı funksiyanı daha ətraflı izah edək:
1. Funksiya adlandırılması ilə yaradılır və salamDe adlı dəyişənə ötürülür.
(2) Sətirdə həmin funksiyanı func dəyişəninə ötürülür.
2. Funksiyada salamDe() həm də func () olaraqda adlandırıla bilər.
Həmdə ilk sətirdə salamDe-ni bildirmək üçün funksiya ifadəsi yaza bilərik :
function salamDe () { // (1) yarat
alert ("Salam");
}
let func = salamDe; // (2) dəyişəndə verilmiş halı (nüsxə)
func (); // Salam // (3) dəyişən işlədir
salamDe(); // Salam // normal işləyir
142
Bütün hamsı eyni zaman işləyəcəkdir. Prosesin necə getdiyini anlamaq üçün
kod yazmağa başlayın.
Hər sətirdən sonra niyə nöqtəli vergül var?
Funksiya ifadəsində sonra nöqtəli vergül olmalıdır.
Cavab çox sadədir:
• Nöqtəli vergül if {...}, for { }, function { } kimi bloklardan sonra qoyulur.
• Funksiya içərisində yazılan ifadədən sonra nöqtəli vergül qoyulur.
let salamDe = function () {...};
func = salamDe;
// ...
function salamDe () {
// ...
}
let salamDe = function () {
// ...
};
143
let salamDe = ...;. Burada nöqtəli vergül ifadə ilə əlaqəsi yoxdur.Sadəcə
ifadəni sonlandırır.
Callback (Geri qayıtma) funksiyaları
Funksiyalara dəyişənə aid etmə və sintaksisinə anlamaq üçün daha çox
nümunəyə baxaq.
Funksiyamızda 3 parametr(sual,bəli,xeyr) yazacıq:
Sual
Sual yazısı
Bəli
Əgər cavab düzdürsə, işləyəcək kod hissəsi
Xeyr
Əgər cavab yanlışdırsa, işləyəcək kod hissəsi
144
Funksiyanın soruşduğu və istifadəçinin cavabına əsasən beli() vəya xeyr()
ifadələri işləyəcəkdir:
function deyir (sual, bəli, xeyr) {
if (confirm (sual)) bəli ()
else xeyr();
}
function gösterBeli ()
alert ("Qəbul etdiniz.");
}
function gosterXeyr () {
alert ("Proses dayandı.");
}
// use: function gosterBəli, gosterXeyr soruşulan arqumentlər olaraq
bildirildi.
deyir ("Qəbul edirsinizmi? ", gosterBəli, gosterXeyr);
145
Bu ifadələrin necə qısa şəkildə yaza bilməzdən əvvəl brauzerdə (bəzi hallarda
server tərəfində) bu funksiyaların necə istifadə edildiyini bilməlisiniz. Real
həyatda funksiyaların istifadəçi ilə əlaqə qurması sadə təsdiq etmədən daha
qarışıq metodların istifadə edilməsi üçündür. Brauzerdə belə bir funksiya
ümumilikdə gözəl görünüşlü pəncərə yaradır. Bunun haqqında digər
bölmələrdə ətraflı danışacıq.
Deyir funksiyasının arqumentlərinə callback funksiyaları vəya sadəcə callback
deyilir.
Callbackların belə anlıya bilərik ki, isitfadəçi suala əgər “bəli” vəya “xeyr”
cavabını verərsə, geri qayıdaraq nəticəni ekranda göstərməsidir.
Eyni funksiyanı daha qısa yazmaq üçün Function Expression-dan istifadə edə
bilərsiniz:
function deyir (sual, beli, xeyr) {
if (confirm (sual)) beli ()
else xeyr ();
}
deyir(
"Qəbul edirsinizmi?",
function () {alert ("Qəbul etdiniz."); },
function () {alert ("Prosesi dayandırdınız."); }
);
146
Funksiyada (deyir(...)) sualın sağında yazılmış parametrlər callbacklardır.
Onların adı yoxdur və bilinməyən kimi adlandırılır. Bu dəyərlər deyirdən
başqa heç nə təsir göstərə bilməz. Tamda istədiyimiz buradadır.
Belə formada kodlaşdırma çox normaldır.Çünki Javascriptin əsas prinsipi elə
budur.
Bir funksiya bir prosesi aparan vasitədir.
Burada yazılar vəya rəqəmlər kimi normal dəyərlər məlumatı təmsil edir.
Bir funksiya bir prosesin baş verəcəyini bildirir.
Dəyişənləri istədiyimiz zaman dəyişə bilərik və yaxud boşda göndərə bilərik.
Dostları ilə paylaş: |