Closure Scope
"Hoisting" JavaScript-də dəyişənlərin, funksiyaların və klasların bir növ skopun başlanğıcında bəyan olunması prosesinə verilmiş addır.
Aşağıdakı kod nümunəsinə baxaq. (Birinci nümunədəki "Hello world" sözlərinin çap olunduğu sətirlər sadəcə olaraq dəyişən yaradılması prosesindən əvvəl kod olsun deyə yazılıb və bizə "hoisting" prosesini başa düşmək üçün heç bir kömək etmir.)
Tutaq ki, belə bir kod bloku ilə tanış olmusunuz və kodu inkişaf etdirmək üçün icra olunarkən 4-cü sətirdəki funksiyanın nə çap edəcəyini bilməyiniz sizə lazımdır.
console.log("Hello world");
console.log("Hello world");
console.log("Hello world");
console.log(a);
var a = 8;
console.log(a);
"Hoisting" prosesindən məlumatı olmayan proqramçılar bu koda baxdıqda onu yuxarıdakı kod bloku kimi görəcək və kodun nə çap edəcəyi sualına böyük ehtimalla "3 dəfə "Hello world" sözləri və daha sonra 8 rəqəmi çap olunacaq" cavabını verəcəklər.
"Hoisting" prosesi ilə tanış olan proqramçılar isə bu kodu öz mental modellərində aşağıdakı kimi quracaq və rahatlıqla "undefined
çap olunacaq" cavabını verəcəklər.
var a;
console.log("Hello world");
console.log("Hello world");
console.log("Hello world");
console.log(a);
a = 8;
console.log(a);
"Hoisting" anlayışı bizdən tələb edir ki, function
açar sözü ilə bəyan olunan funksiya, klas və var
açar sözü ilə yaradılan dəyişənlər üçün mental modelimizi 2-ci nümunədəki kimi quraq.
Gəlin "hoisting" proses ilə ətraflı tanış olaq.
"JavaScript"də "hoisting"
Bir çox proqramçı "hoisting"i yuxarıda izah etdiyim kimi başa düşür və kodu bu şəkildə yazır. Lakin reallıqda "JavaScript"də "hoisting" heç də kodu yuxarı çəkmir. Bunun yerinə kod icra olunmazdan əvvəl yaradılma fazası ("Creation Phase") adlı proses baş tutur. Bu proses zamanı hər bir funksiya, dəyişən, klasa görə dəyişənlər mühitində ("variable enviroment"də) yer ayrılır və dəyəri undefined
və ya funksiyaya bərabər edilir.
Gəlin bunların hər birinə daha yaxından baxaq.
function
açar sözü ilə funksiya bəyan edərkən "hoisting"
function
açar sözü ilə bəyan edilən funksiyalar "JavaScript"də "hoisting" prosesinə məruz qalır və ilkin dəyəri elə funksiyanın özünə bərabər olur. Bu o deməkdir ki, biz o funksiyanı yaratdığımız sətirdən yuxarıda da istifadə edə bilərik.
sum(5, 4);
function sum(a, b) {
const c = a + b;
console.log(c);
return c;
}
Başqa proqramlaşdırma dilləri ilə təcrübəsi olan bəzi proqramçılar yuxarıdakı kod blokunun xətaya səbəb olacağını düşünə bilər. "JavaScript"də də "hoisting" anlayışı olmasayadı, eyni nəticəni görə bilərdik.
var
açar sözü ilə dəyişən yaradarkən "hoisting"
var
açar sözü ilə yaradılan dəyişənlər də "hoisting"ə məruz qalır və ilkin dəyəri undefined
kimi müəyyən olunur.
console.log(a)
var a= 7
let
və const
açar sözü ilə dəyişən yaratma zamanı "hoisting"
let
və const
açar sözü ilə yaradılan dəyişənlər "hoisting" prosesinə məruz qalmır və onları elan etdiyimiz sətirdən yuxarıda istifadə etsək, xəta ilə qarşılaşacağıq.
console.log(a) //Uncaught ReferenceError: Cannot access 'a' before initialization
let a = 7
console.log(a) //Uncaught ReferenceError: Cannot access 'a' before initialization
const a = 7
Texniki olaraq let
və const
açar sözü ilə yaradılan dəyişənlər də "hoisting" olunur və dəyəri "initialized"a bərabər olur, lakin bu dəyişənlərin