Funksiyaların Leksik Muhiti JavaScript-də Necə Tətbiq Olunur

Tutaq ki, bizim nəticəsi kimi başqa bir funksiya qaytaran funksiyamız var:

javascriptfunction test() {
  return function() {
    
  }
}

Əgər ana funksiyanın hər hansı dəyişənləri varsa, bu dəyişənlər qaytarılan funksiyanın leksik mühitində yer alacaq:

javascriptfunction test() {
  let num = 1; // ana funksiyanın dəyişəni
  
  return function() {
    // leksik mühit = {num: 1}
  }
}

Gəlin qaytarılan funksiyamızın koduna num dəyişəninin qiymətini çıxaran console.log yazaq:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

Gəlin indi ana test funksiyasını çağıraq və onun işinin nəticəsini func dəyişəninə yazaq:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

let func = test();

func dəyişəninə qaytarılan funksiya yazılacaq. Gəlin funksiyamızı çağıraq - o, öz nəticəsi kimi num dəyişəninin məzmununu çıxaracaq:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

let func = test();
func(); // 1 çıxaracaq

Əgər sadəcə num dəyişənini funksiyadan kənarda çıxarmağa çalışsaq, o, əlçatan olmayacaq:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

console.log(num); // num dəyişəni burada əlçatan deyil

Gördüyünüz kimi, num lokal dəyişəni funksiyamızın leksik mühitinə bağlandı və indi, bu funksiyanı kodun hər hansı yerində çağıranda, num dəyişəninin qiymətini əldə edə bilərik, hətta çağırış yerində bu dəyişən özü əlçatan olmasa belə.

Əslində, oxşar nəticəyə num dəyişənini qlobal etməklə də nail olmaq olar:

javascriptfunction test() {
  return function() {
    console.log(num);
  }
}

let num = 1; // qlobal dəyişən
let func = test();
func(); // 1 çıxaracaq

Lakin burada əhəmiyyətli bir fərq olacaq: yeni variantda num dəyişənini funksiyaların xaricində dəyişmək olar (çünki o, qlobaldır), köhnə variantda isə - olmaz.

Задание 1

Kodu işə salmadan müəyyən edin ki, konsola nə çıxarılacaq:

javascriptfunction test() {
  let num1 = 1;
  let num2 = 2;
  
  return function() {
    return num1 + num2;
  }
}

let func = test();
console.log(func());
Задание 2

Kodu işə salmadan müəyyən edin ki, konsola nə çıxarılacaq:

javascriptfunction test() {
  let num1 = 1;
  let num2 = 2;
  
  return function() {
    return num1 + num2;
  }
}

console.log(test()());
Задание 3

Kodu işə salmadan müəyyən edin ki, konsola nə çıxarılacaq:

javascriptfunction test() {
  let num1 = 1;
  
  return function() {
    return num1 + num2;
  }
}

let num2 = 2;
let func = test();
console.log(func());
Задание 4

Kodu işə salmadan müəyyən edin ki, konsola nə çıxarılacaq:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    return num;
  }
}

let num = 2;
let func = test();
console.log(func());