Hoisting
JavaScript mühərriki (engine), JavaScript kodunu icra edərkən bir icra konteksti (execution context) yaradır və bunun iki mərhələsi var:
- Yaradılış (Creation)
- İcra (Execution)
Yaradılış mərhələsində (Creation), JavaScript mühərriki dəyişən və funksiyaları kodun ən yuxarı hissəsinə qaldırır. Bu proses “hoisting” deyilir.
Aşağıda göstərilən nümunədə JavaScript dəyişəni yuxarı qaldırıldığı (hoisting) üçün səhv vermir:
console.log(sayHi); // undefined
var sayHi = "Hello";
Yuxarıdakı kod, aşağıdakı kimi işləyir:
var sayHi;
console.log(sayHi); // undefined
sayHi = "Hello";
Yaradılış (creation) mərhələsində, JavaScript mühərriki dəyişəni (variable) yaddaşa yerləşdirir undefined
dəyərini verir.
Let ilə hoisting
İndi isə həmin kodu let
açar sözü ilə yazaq:
console.log(sayHi);
let sayHi = "Hello";
Burada JavaScript xətası verəcək: “ReferenceError: Cannot access ‘sayHi’ before initialization”
Xətadan göründüyü kimi, sayHi
dəyişəni artıq yaradılıb, let
və const
ilə yaradılmış dəyişənlər hoisting edilir, ancaq JavaScript onu bizim üçün əlçatan etmir.
console.log(learnJavaScript);
let x = Math.random() * 10;
Burada learnJavaScript
adlı dəyişən yaradılmadığı üçün JavaScript xətası verəcək: “ReferenceError: learnJavaScript is not defined”
Bu qayda const üçün də keçərlidir.
Funksiya Hoisting
Dəyişənlər kimi, JavaScript mühərriki funksiyaları da yuxarı qaldırır (hoisting).
let result = sum(2, 4);
console.log(result); // 6
function sum(a, b) {
return a + b;
}
Yuxarıdakı kod, aşağıdakı kimi işləyir:
function sum(a, b) {
return a + b;
}
let result = sum(2, 4);
console.log(result); // 6
Function expressions
let result = sum(2, 4);
console.log(result); // Uncaught ReferenceError: sum is not defined
const sum = (a, b) => {
return a + b;
};
Burada JavaScript sum
-ı dəyişən kimi qəbul edir və yaradılış mərhələsində sum
“undefined” olur.
Bu qayda arrow function-lar üçün də keçərlidir.