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

letconst açar sözü ilə dəyişən yaratma zamanı "hoisting"

letconst 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 letconst 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

muhabbet4198090
#JavaScript
Abdulla Bashiroglu
Müəllİf
Abdulla bəşiroğlu
Front-end developer

Join the newsletter

For weekly notes on visual thinking For weekly notes on visual thinking