Zbatimi i Mjedisit Leksikor të Funksioneve në JavaScript

Le të themi se kemi një funksion që kthen në rezultat një funksion tjetër:

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

Nëse funksioni prind ka ndonjë variabël, ato variabla do të përmbahen në mjedisin leksikor të funksionit të kthyer:

javascriptfunction test() {
  let num = 1; // variabla e funksionit prind
  
  return function() {
    // mjedisi leksikor = {num: 1}
  }
}

Le të shkruajmë në kodin e funksionit tonë të kthyer console.log, i cili shfaq vlerën e variablës num:

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

Tani le ta thërrasim funksionin prind test dhe rezultatin e tij ta regjistrojmë në variablin func:

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

let func = test();

Në variablin func do të regjistrohet funksioni i kthyer. Le ta thërrasim funksionin tonë - si rezultat do të shfaqë përmbajtjen e variablës num:

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

let func = test();
func(); // do të shfaqë 1

Nëse përpiqemi thjesht të shfaqim variablin num jashtë funksionit - ajo nuk do të jetë e disponueshme:

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

console.log(num); // variabla num nuk është e disponueshme këtu

Siç e shihni, variabla lokale num u lidh me mjedisin leksikor të funksionit tonë dhe tani, duke e thirrur këtë funksion kudo në kod, ne mund të marrim vlerën e variablës num, edhe nëse në vendin e thirrjes vetë kjo variabël nuk është e disponueshme.

Në fakt, një rezultat i ngjashëm mund të arrihet duke e bërë variablin num globale:

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

let num = 1; // variabël globale
let func = test();
func(); // do të shfaqë 1

Megjithatë, këtu do të ketë një ndryshim të rëndësishëm: në variantin e ri variabla num mund të ndryshohet jashtë funksioneve (pasi është globale), ndërsa në atë të vjetër - jo.

Задание 1

Përcaktoni, pa e ekzekutuar kodin, çfarë do të shfaqet në konsol:

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

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

Përcaktoni, pa e ekzekutuar kodin, çfarë do të shfaqet në konsol:

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

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

Përcaktoni, pa e ekzekutuar kodin, çfarë do të shfaqet në konsol:

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

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

Përcaktoni, pa e ekzekutuar kodin, çfarë do të shfaqet në konsol:

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

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