TypeScript statik tip təyin etmə imkanı verən JavaScript üzərində genişlənmiş bir proqramlaşdırma dilidir. Bu dildə məlumat strukturlarını daha aydın və təhlükəsiz şəkildə təsvir etmək üçün iki əsas vasitə var: type və interface.
Bunların hər ikisi obyektlərin və verilən strukturlarının formasını təsvir etmək üçün istifadə olunur. Ancaq aralarında bəzi fərqli imkanlar və istifadə məqsədləri mövcuddur.
interface nədir?
interface – Obyektlərin strukturunu müəyyən etmək üçün istifadə olunur. Bir obyekt hansı sahələrə (fields) malik olacaq, onların tipi nə olacaq və hansılar məcburidir – bunlar interfeyslə müəyyənləşdirilir.
Nümunə:
interface Person {
name: string;
age: number;
isStudent?: boolean; // optional field
}
Burada Person adlı interfeys name, age və istəyə bağlı isStudent sahələrini müəyyən edir.
type nədir?
type daha geniş imkanlara malikdir. O, həm obyektləri, həm də primitiv tipləri, birlik tipləri (union types), kəsişmə tipləri (intersection types) və tuple-ları təsvir edə bilər.
Nümunə:
type Person = {
name: string;
age: number;
};
Bu da interface-ə bənzər bir strukturdur, lakin type ilə aşağıdakıları da edə bilərik:
Union Type (bir neçə növdən biri):
type Status = "success" | "error" | "loading";
Intersection Type (birləşmiş struktur):
type Address = {
city: string;
};
type Employee = Person & Address;
Ortalıq Oxşarlıqları
İmkan
type
interface
Obyekt strukturu yaratmaq
Miras alma (inheritance)
Union və intersection yaratmaq
Tuple və primitive növləri müəyyənləşdirmək
Yenidən açılıb sahə əlavə etmək
(Declaration merging)
interface və type fərqləri
Fərq
type
interface
Quraşdırılmış genişlənmə
type& operatoru ilə genişlənir
interface birbaşa extends ilə genişlənə bilər
Union, Intersection
Tam dəstəklənir
Dəstəklənmir
Declaration merging (təkrar elan etmə)
Olmaz
Olur
Primitiv tipləri təyin etmək
Mümkündür (type Age = number)
Mümkün deyil
Hansını nə vaxt istifadə etməli?
Sadəcə obyekt strukturu təsvir edirsinizsə, interface istifadə etmək tövsiyə olunur.
Əgər union, intersection, primitiv və ya tuple növləri ilə işləyirsinizsə, type daha uyğun olar.
Üçüncü tərəf kitabxanalarında (React, Express) tez-tez interface istifadə olunur.
Real dünya nümunəsi
interface User {
id: number;
name: string;
}
type Role = "admin" | "user" | "guest";
type UserWithRole = User & {
role: Role;
};
Burada həm interface, həm də type birlikdə istifadə olunub.
Nəticə
TypeScript-də type və interface hər ikisi strukturların və məlumatların təhlükəsiz işlənməsi üçün çox faydalıdır. Onların düzgün seçilməsi kodun daha oxunaqlı, yenidən istifadə oluna bilən və davamlı olmasını təmin edir.
Əgər sadə obyekt strukturu ilə işləyirsinizsə – interface, daha kompleks tip təriflərinə ehtiyac varsa – type istifadə edin.
Agregat funksiyalar, Oracle SQL-də bir və ya bir neçə sətirdən ibarət məlumatları analiz etmək və ümumi nəticə çıxarmaq üçün istifadə olunur. Bu funksiyalar cədvəllərdəki dəyərləri qruplaşdırmaq, hesablamaq və filtrasiya etmək imkanı verir.
Aşağıdakı ən çox istifadə olunan agregat funksiyalarla tanış olaq:
İlk öncə misalları rahat göstərmək üçün employees adından cədvəl yaradaq və məlumatları ora əlavə edək
Bu funksiya müəyyən bir sütundakı və ya bütün cədvəldəki sətirlərin sayını verir.
Sintaksis:
SELECT COUNT(*) FROM employees; --4
Bütün işçilərin sayını qaytarır.
Sütun səviyyəsində:
SELECT COUNT(department_id) FROM employees; --3
NULL olmayan department_id sütunlarının sayını qaytarır.
SUM() – Toplam hesablayır
Bu funksiya ədədi dəyərləri toplayır.
SELECT SUM(salary) FROM employees; --9600
Bütün işçilərin ümumi maaşını qaytarır.
AVG() – Orta dəyəri hesablayır
Bu funksiya ədədi sütun üzrə orta (average) dəyəri verir.
SELECT AVG(salary) FROM employees; --2400
Bütün işçilərin orta maaşını göstərir.
MIN() – Ən kiçik dəyəri tapır
Ən aşağı ədədi və ya əlifba sıralamasına görə minimum dəyəri qaytarır.
SELECT MIN(salary) FROM employees; --1600
Ən az maaşı olan işçinin maaşını qaytarır.
SELECT MIN(name) FROM employees; --Emily Davis
Əlifba sırasına görə ilk gələn adı göstərir.
MAX() – Ən böyük dəyəri tapır
Ən yüksək dəyəri qaytarır.
SELECT MAX(salary) FROM employees; --3500
Ən yüksək maaşı göstərir.
GROUP BY ilə agregat funksiyalar
Agregat funksiyaları GROUP BY ilə birlikdə istifadə edərək məlumatları qruplar üzrə analiz etmək mümkündür.
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id;
Hər şöbə üçün orta maaş göstərilir.
HAVING ilə agregat filtr
Agregat nəticələri filtrasiya etmək üçün HAVING istifadə olunur. WHERE fərdi sətirlər üçün, HAVING isə GROUP BY nəticələri üçün tətbiq edilir.
SELECT department_id, COUNT(*)
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 5;
Yalnız 5-dən çox işçisi olan şöbələri göstərir.
Nəticə
Oracle SQL-də agregat funksiyalar məlumatların xülasəsini çıxarmaq, ümumi mənzərəni görmək və qruplar üzrə analiz aparmaq üçün çox faydalıdır. GROUP BY, HAVING kimi əmr və funksiyalarla birlikdə istifadə olunduqda, çox güclü hesabatlar və analizlər aparmaq mümkündür.
Verilənlər bazasında məlumatlar adətən normalizasiya edilmiş, yəni müxtəlif cədvəllərdə saxlanılır. Bu cədvəlləri əlaqələndirmək üçün JOIN əməliyyatlarından istifadə olunur. Oracle SQL-də bir neçə növ JOIN mövcuddur və hər biri fərqli ehtiyaclara cavab verir.
1. INNER JOIN – Daxili birləşdirmə
INNER JOIN iki və ya daha çox cədvəldə yalnız uyğun gələn (ortaq açar dəyəri olan) sətirləri birləşdirir. Nəzəri olaraq, inner join SQL sorğusu iki cədvəl arasında müqayisə edilən sətrlərin hamısının eyni dəyərlərə malik olması tələb olunur. Nəticədə, yalnız uyğunluq olan sətrləri nəticəyə əlavə edir.
Nümunə üçün iki cədvəli düşünək:
Cədvəl 1: sifarişlər (orders)
order_id
customer_id
goods_name
order_date
101
1
Laptop
2024-05-01
102
1
Telefon
2024-05-03
103
2
Tablet
2024-05-02
104
3
Kamera
2024-05-04
105
3
Klaviatura
2024-05-05
Cədvəl 2: müştərilər (customers)
customer_id
name
surname
1
Ali
Məmmədov
2
Nigar
Əliyeva
3
Cavid
Məmmədli
Bu iki cədvəli birləşdirmək üçün aşağıdakı SQL sorğusunu istifadə edə bilərik:
SELECT customers.name, customers.surname, orders.goods_name, orders.order_date
FROM orders
INNER JOIN customers ON customers.customer_id = orders.customer_id;
Bu sorğunun nəticəsi belə olacaq:
name
surname
goods_name
order_date
Ali
Məmmədov
Laptop
2024-05-01
Ali
Məmmədov
Telefon
2024-05-03
Nigar
Əliyeva
Tablet
2024-05-02
Cavid
Məmmədli
Kamera
2024-05-04
Cavid
Məmmədli
Klaviatura
2024-05-05
Bu sorğu “müştərilər” və “sifarişlər” cədvəllərini customer_id sütunu əsasında birləşdirir. Nəticədə, hər bir sifarişin hansı müştəri tərəfindən verildiyi və sifariş tarixi ilə birlikdə müştəri adını və soyadını göstərir.
-- müştərilərilər cədvəlinin yaradılması
CREATE TABLE customers (
customer_id NUMBER PRIMARY KEY,
name VARCHAR2(50),
surname VARCHAR2(50)
);
-- müştərilər cədvəlinin doldurulması
INSERT INTO customers (customer_id, name, surname) VALUES
(1, 'Ali', 'Məmmədov'),
(2, 'Nigar', 'Əliyeva'),
(3, 'Cavid', 'Məmmədli');
-- sifarişlər cədvəlinin yaradılması
CREATE TABLE orders (
order_id NUMBER PRIMARY KEY,
customer_id NUMBER,
goods_name VARCHAR2(100),
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
-- sifarişlər cədvəlinin doldurulması
INSERT INTO orders (order_id, customer_id, goods_name, order_date) VALUES
(101, 1, 'Laptop', DATE '2024-05-01'),
(102, 1, 'Telefon', DATE '2024-05-03'),
(103, 2, 'Tablet', DATE '2024-05-02'),
(104, 3, 'Kamera', DATE '2024-05-04'),
(105, 3, 'Klaviatura', DATE '2024-05-05');
2. LEFT JOIN – Sol birləşdirmə
LEFT JOIN sol cədvəldəki bütün sətirləri, sağ cədvəldə isə yalnız uyğun gələnləri birləşdirir. Əgər sağ tərəfdə uyğun sətir yoxdursa, həmin sütunlarda NULL göstərilir.
İki cədvəl nümunəsi:
employees cədvəli:
employee_id
name
department_id
1
John Smith
10
2
Jane Doe
NULL
3
Emily Davis
20
4
Michael Brown
30
departments cədvəli:
department_id
department_name
10
IT
20
HR
30
Finance
SELECT employees.employee_id, employees.name, departments.department_name
FROM employees
LEFT JOIN departments
ON employees.department_id = departments.department_id;
RIGHT JOIN sağ cədvəldəki bütün sətirləri, sol cədvəldə isə uyğun gələnləri birləşdirir. Əgər sol cədvəldə uyğun gələn sətir yoxdursa, onda nəticə dəstində sol cədvəldəki sütunlar üçün NULL dəyərləri olacaq.
Bir nümunə ilə izah edək. İki cədvəlimiz var:
Orders (Sifarişlər)
Customers (Müştərilər)
Orders cədvəli:
OrderID
CustomerID
OrderDate
1
1001
2023-01-15
2
1002
2023-02-20
3
1003
2023-03-12
Customers cədvəli:
CustomerID
CustomerName
1001
Ali
1002
Ayşe
1004
Mehmet
RIGHT JOIN sorğusu ilə Orders və Customers cədvəllərini birləşdirək:
SELECT Orders.OrderID, Orders.OrderDate, Customers.CustomerName
FROM Orders
RIGHT JOIN Customers ON Orders.CustomerID = Customers.CustomerID;
Bu sorğunun nəticəsi belə olacaq:
OrderID
OrderDate
CustomerName
1
2023-01-15
Ali
2
2023-02-20
Ayşe
NULL
NULL
Mehmet
Göründüyü kimi, Customers cədvəlindəki bütün müştərilər nəticədə göstərilir, hətta Orders
cədvəlində uyğun gələn sifariş olmadıqda belə. Mehmet üçün sifariş məlumatı olmadığından, onun üçün NULL dəyərləri qaytarılır.
🧬 Object.create() vasitəsilə İrsi əlaqə (Inheritance)
JavaScript-də irsi əlaqə qurmağın başqa bir güclü və sadə yolu Object.create() metodudur. Bu metod vasitəsilə yeni bir obyekt yaradılır və bu obyektin prototipi kimi istədiyimiz digər bir obyekt təyin edilir.
Bu üsul klassik constructor-lar və prototype zənciri qurmaqdan daha sadə və daha oxunaqlıdır.
rabbit obyektini Object.create(animal) ilə yaratmışıq.
rabbit obyektində eats xüsusiyyəti yoxdur, lakin animal onun prototipidir, ona görə həmin xüsusiyyətə çatmaq mümkündür.
Bu, prototip zəncirinin bir hissəsidir və miras alınmış metod və xüsusiyyətlər animal obyektindən gəlir.
Object.create() istifadəsinin üstünlükləri:
Daha sadə sintaksis.
Klassik constructor funksiyalarına ehtiyac olmadan obyekt əsaslı irsilik qurmaq imkanı.
Müxtəlif obyektlər arasında açıq şəkildə əlaqə yaratmaq olur.
Test və prototipləşdirmə üçün çox uyğundur və çevikdir.
Beləliklə, Object.create() JavaScript-də irsi əlaqənin daha bir güclü vasitəsidir və Prototype Chain anlayışının birbaşa tətbiqini nümayiş etdirir. Bu metod xüsusilə funksional proqramlaşdırma yanaşmalarında və modul sistemlərində tez-tez istifadə olunur.
JavaScript obyekt yönümlü proqramlaşdırma (OOP) yanaşmasını prototip əsaslı sistem vasitəsilə həyata keçirir. Bu, digər obyektlərin xüsusiyyətlərini miras almaq üçün klassik classlardan istifadə etmədən, obyektlər arasında birbaşa əlaqə qurulmasına imkan verir. Bu prosesə Prototype Chain, yəni Prototip Zənciri deyilir.
Prototip nədir?
JavaScript-də hər bir obyektin arxasında [[Prototype]] adlı gizli bir xüsusiyyət var. Bu xüsusiyyət digər obyektə (və ya null-a) istinad edir. Əgər siz bir obyektin içində müəyyən xüsusiyyət və ya metod axtarırsınızsa, JavaScript əvvəlcə həmin obyektin özündə yoxlayır, əgər tapa bilmirsə, onun prototipində axtarmağa davam edir. Bu proses Prototip Zəncirini təşkil edir.
Prototip zəncirinin iş prinsipi
Tutaq ki, bir obyektin içində sayHello() adlı metod yoxdur. JavaScript bu metodu həmin obyektin [[Prototype]]-ində axtarır. Əgər orada da tapa bilmirsə, növbəti prototipə keçir və bu proses null-a qədər davam edir.
Burada rabbit → animal → creature zənciri qurulub. rabbit.breathes çağırışı 3 səviyyəli zəncir vasitəsilə true cavabı verir.
Prototiplər və Constructor funksiyalar
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function () {
console.log("Salam, mənim adım " + this.name);
};
const user = new Person("Elvin");
user.sayHello(); // Salam, mənim adım Elvin
Burada user obyektinin sayHello metodu özündə yoxdur. JavaScript onun konstruktorunun (Person) prototype obyektinə baxır və oradan tapır.
🧬 Object.prototype və Zəncirin sonu
JavaScript-də bütün obyektlər nəticədə Object.prototype-dən miras alır.
Oracle SQL verilənlər bazası ilə işləyənlər üçün əsas əmrlərdən bəziləri cədvəl yaratmaq, cədvələ məlumat əlavə etmək və məlumatları sorğulamaqdır. Bu əmrlər vasitəsilə siz öz bazanızı qurur, məlumatları saxlayır və onlara çıxış əldə edirsiniz.
🧱 1. CREATE TABLE – Yeni cədvəl yaratmaq
Oracle SQL-də yeni bir cədvəl yaratmaq üçün CREATE TABLE əmri istifadə olunur.
Proqramlaşdırma paradigmaları — proqramların necə yazılacağını və necə qurulacağını müəyyən edən yanaşmalar və modellər toplusudur. Hər bir paradigma öz qaydaları, düşüncə tərzi və kod yazma üsulları ilə fərqlənir. Paradigmalar proqramçılara daha səliqəli, çevik və başa düşülən kod yazmaqda kömək edir.
Bu anlayışı daha sadə şəkildə ifadə etsək, proqramlaşdırma paradigmaları – “problemi necə həll etməliyik?” sualına verilən müxtəlif cavablardır.
Əsas proqramlaşdırma paradigmaları
1. İmperativ paradigma
İmperativ proqramlaşdırma, kompüterə “nə etməli” olduğunu deyil, “necə etməli” olduğunu deməkdir. Bu yanaşmada proqramçı ardıcıl əmrlərlə kompüterin nə edəcəyini təyin edir.
Xüsusiyyətləri:
Dəyişənlərdən istifadə olunur
Addım-addım təlimat verilir
Nəticə ardıcıl əməliyyatlarla əldə edilir
Məşhur dillər: C, Python, JavaScript
Misal:
let total = 0;
for (let i = 1; i <= 5; i++) {
total += i;
}
console.log(total); // 15
2. Deklarativ paradigma
Deklarativ proqramlaşdırma nə etmək istədiyini deyir, necə etmək lazım olduğunu isə sistem özü qərar verir. Yəni məqsədi göstəririk, amma yolu yox.
Məşhur dillər və texnologiyalar: SQL, HTML, React (JSX)
Bu paradigma obyektlər üzərində qurulub. Obyekt — bir varlığı (nəsnəni) təmsil edir və bu varlığın xüsusiyyətləri (property) və funksiyaları (method) olur.
Əsas prinsiplər:
Enkapsulyasiya (Encapsulation)
İrsi əlaqə (Inheritance)
Polimorfizm (Polymorphism)
Abstraksiya (Abstraction)
Məşhur dillər: Java, C++, Python, JavaScript (ES6+)
Misal:
class Animal {
speak() {
console.log("Animal sound");
}
}
class Dog extends Animal {
speak() {
console.log("Woof!");
}
}
const dog = new Dog();
dog.speak(); // Woof!
4. Funksional paradigma
Funksional proqramlaşdırma təmiz funksiyalara əsaslanır. Bu yanaşma dəyişənlərin dəyişdirilməməsi (immutability) və funksiyaların birinci səviyyə obyektlər kimi istifadə olunması prinsiplərinə əsaslanır.
Xüsusiyyətləri:
Təmiz funksiyalar (pure functions)
Yan təsirsiz (no side effects)
Dəyişməzlik (immutability)
Məşhur dillər: Haskell, Lisp, Elm, JavaScript (funksional üslub)
Çoxlu proqramlaşdırma dilləri birdən çox paradigmanı dəstəkləyir. Məsələn, Python, JavaScript və C# həm obyekt-yönlü, həm də funksional yanaşmaları dəstəkləyir.
Paradigmanın seçilməsi
Proqramlaşdırma paradigması seçərkən aşağıdakıları nəzərə almaq faydalıdır:
Problem növü və miqyası
Komanda bacarıqları
Dilin imkanları
Performans və oxunaqlılıq
Nəticə
Proqramlaşdırma paradigmaları, bir problemi necə modelləşdirəcəyimizi və həll edəcəyimizi formalaşdıran çərçivələrdir. Hər bir yanaşmanın öz üstünlükləri və zəif cəhətləri var. Müasir proqramçılar bir neçə paradigmaya bələd olmalı və uyğun vəziyyətdə düzgün yanaşmanı seçməyi bacarmalıdır.
JavaScript-də funksiyalar obyektlər kimi qəbul olunur. Bu səbəbdən funksiyalara aid əlavə metodlardan istifadə etmək mümkündür. Bu metodlardan ən çox istifadə olunanları bind(), call() və apply() funksiyalarıdır. Bu metodlar vasitəsilə funksiyanın this kontekstini istədiyimiz şəkildə dəyişə bilərik.
Bu məqalədə hər üçünü sadə və aydın şəkildə izah edəcəyik.
1. call() Metodu
Təyinat:
call() funksiyası bir funksiyanı başqa bir obyektin konteksti (this) ilə çağırmağa imkan verir.
Sintaksis:
funksiya.call(thisArg, arg1, arg2, ...)
thisArg – funksiyanın içində this olaraq istifadə ediləcək obyekt.
const user = {
ad: 'Nilay',
salamla: function(yas) {
console.log(`Salam, mənim adım ${this.ad} və mən ${yas} yaşındayam.`);
}
};
const digerUser = {
ad: 'Elvin'
};
user.salamla.call(digerUser, 30);
// Çıxış: Salam, mənim adım Elvin və mən 30 yaşındayam.
apply() funksiyası call() metoduna bənzəyir, yalnız arqumentlər massiv (array) şəklində verilir.
Sintaksis:
funksiya.apply(thisArg, [arg1, arg2, ...])
Nümunə:
function topla(a, b) {
return a + b;
}
console.log(topla.apply(null, [5, 10])); // 15
İstifadə Fərqi:
call() → arqumentləri ayrı-ayrı ötürürük.
apply() → arqumentləri massiv kimi ötürürük.
3. bind() Metodu
Təyinat:
bind() funksiyası call() və apply() kimi this kontekstini dəyişmək üçün istifadə olunur, lakin funksiyanı dərhal çağırmır. Əvəzində, yeni bir funksiyanı qaytarır.
const user = {
ad: 'Nilay'
};
function salamla(yas) {
console.log(`Salam, mənim adım ${this.ad} və mən ${yas} yaşındayam.`);
}
const salamlaNilay = salamla.bind(user, 25);
salamlaNilay(); // Salam, mənim adım Nilay və mən 25 yaşındayam.
const user = {
ad: 'Nilay',
salamla: function() {
console.log(`Salam, mənim adım ${this.ad}`);
}
};
setTimeout(user.salamla, 1000); // undefined (çünki this itirilib)
setTimeout(user.salamla.bind(user), 1000); // Salam, mənim adım Nilay
Nəticə
bind(), call() və apply() JavaScript funksiyalarında this kontekstini idarə etmək üçün əsas vasitələrdir. Onların fərqlərini və istifadələrini bilmək, daha təmiz və anlaşılan kod yazmağınıza kömək edəcək.
call() və apply() dərhal funksiyanı çağırır.
bind() isə yeni bir funksiya qaytarır və istənilən vaxt çağırmaq mümkündür.
Bu metodlar — funksiya davranışına nəzarət etmək və təkrar istifadəni artırmaq üçün proqramçının alətlər çantasındakı vacib alətlərdəndir.
Closure JavaScript-də çox vacib və güclü bir anlayışdır. Bu anlayışı bilmək funksiyaların necə işlədiyini daha dərindən anlamağa kömək edir və bir çox qabaqcıl texnikaların əsasını təşkil edir.
Sadə dillə desək, closure — bir funksiyanın özünün daxilində yaradıldığı mühitə (scope) çıxış əldə etməsi deməkdir, hətta o mühit artıq mövcud olmasa belə.
Closure necə işləyir?
JavaScript-də bir funksiya başqa bir funksiyanın içində yaradıldıqda, daxili funksiya xarici funksiyanın dəyişənlərinə çıxış edə bilir. Bu əlaqə closure adlanır.
Başqa sözlə:
Daxili funksiya (inner function) xarici funksiyanın (outer function) dəyişənlərini “yada saxlayır” və istifadə edə bilir.
multiplier(2) çağırışında x=2 dəyəri yadda qalır və iki dəfə artıran funksiya yaranır.
Closure xüsusiyyətləri
Xüsusiyyət
Təsviri
Mühit
Closure funksiyanın yaradıldığı mühiti saxlayır
Uzunömürlülük
Closure-lar lazımi dəyişənləri yadda saxlayır, mühit bağlansa da işləyir
Özəl dəyişənlər
Closure ilə xaricdən dəyişdirilə bilməyən dəyişənlər yaradıla bilər
Nəticə
Closure JavaScript proqramlaşdırmasında çox güclü bir anlayışdır. Bu konsepti başa düşmək kodunuzu daha güclü, çevik və təhlükəsiz edəcəkdir. Closure-ları başa düşən proqramçı asinxron əməliyyatları, modul dizaynını və kompleks funksiyaları daha rahat idarə edə bilər.
Unutmayın: Closure — funksiyanın yadda saxladığı gizli bağdır.
Hoisting JavaScript-də olduqca vacib və bəzən çaşdırıcı bir anlayışdır. Bu anlayışı düzgün başa düşmək səhvlərin qarşısını almağa kömək edir və kodun necə işlədiyini daha yaxşı anlamağımıza səbəb olur.
Sadə dillə desək, hoisting o deməkdir ki, bütün dəyişənlərin və funksiyaların tanımlamaları (declarations) avtomatik olaraq kodun başlanğıcına “qaldırılır”.
Yəni, siz dəyişən və ya funksiyanı kodda sonradan yazsanız belə, JavaScript onu icra etməzdən əvvəl başa keçirir və hazır vəziyyətə gətirir.
Dəyişənlərdə hoisting
JavaScript-də var, let və const ilə elan edilmiş dəyişənlər fərqli şəkildə hoisting olur.
1. var ilə hoisting
var ilə elan edilən dəyişənlər tam şəkildə undefined dəyəri ilə yuxarıya qaldırılır.
Nümunə:
console.log(a); // undefined
var a = 5;
console.log(a); // 5
İzah:
JavaScript əvvəlcə var a; sətrini avtomatik olaraq kodun əvvəlinə gətirir.
Ona görə də birinci console.log(a); zamanı a dəyişəni mövcuddur, amma dəyəri undefined olur.
Əslində kod belə görünür:
var a;
console.log(a); // undefined
a = 5;
console.log(a); // 5
2. let və const ilə hoisting
let və const ilə elan edilən dəyişənlər də hoisting olunur, amma onlar Temporal Dead Zone (TDZ) adlanan bir mərhələyə düşürlər.
Bu zaman dəyişən elan olunana qədər istifadə edilərsə, ReferenceError səhvi alınır.
Nümunə:
console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 10;
Nümunə const üçün də eynidir.
Bu kod belə görünür:
// b hoisted olur, amma dəyəri yoxdur, TDZ-dadır
let b;
console.log(b); // ReferenceError
b = 10;
Funksiyalarda hoisting
Funksiya elan etmənin (function declaration) və funksiya ifadələrinin (function expression) hoisting davranışı da fərqlidir.
1. Funksiya elanları (Function Declarations)
Funksiya elanları tam şəkildə hoisting olunur. Yəni funksiya koddan əvvəl çağırıla bilər.
Nümunə:
greet(); // "Salam!"
function greet() {
console.log('Salam!');
}
İzah:
JavaScript bütün funksiyanı yuxarı qaldırır, ona görə greet funksiyasını əvvəl çağırmaq mümkündür.
2. Funksiya ifadələri (Function Expressions)
Funksiya ifadələri hoisting olunur, amma onlar dəyişən kimi davranır. Əgər var ilə elan ediliblərsə, undefined, let və const ilə elan ediliblərsə, ReferenceError verirlər.
Qaldırılır, amma dəyişənin hoisting qaydalarına uyğundur
Praktik töhvsiyələr
let və const istifadə edin: Daha təhlükəsiz və oxunaqlı kod üçün.
Funksiyaları əvvəlcədən elan edin: Oxumağı və anlamağı asanlaşdırır.
Dəyişənləri istifadə etməzdən əvvəl elan edin: Səhv ehtimalını azaldır.
Nəticə
Hoisting JavaScript-in əsas və vacib xüsusiyyətlərindən biridir. Dəyişənlərin və funksiyaların necə “qaldırıldığını” bilmək kod səhvlərindən yayınmağa və proqramın necə işlədiyini daha yaxşı anlamağa kömək edir.
Unutmayın: var təhlükəli hoisting davranışına səbəb ola bilər, let və const isə daha təhlükəsizdir!