Zbatimi i Mjedisit Leksikor të Funksioneve në JavaScript
Le të themi se kemi një funksion që kthen në rezultat një funksion tjetër:
function test() {
return function() {
}
}
Nëse funksioni prind ka ndonjë variabël, ato variabla do të përmbahen në mjedisin leksikor të funksionit të kthyer:
function 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:
function 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:
function 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:
function 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:
function 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:
function 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.
Përcaktoni, pa e ekzekutuar kodin, çfarë do të shfaqet në konsol:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Përcaktoni, pa e ekzekutuar kodin, çfarë do të shfaqet në konsol:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Përcaktoni, pa e ekzekutuar kodin, çfarë do të shfaqet në konsol:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Përcaktoni, pa e ekzekutuar kodin, çfarë do të shfaqet në konsol:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());