Примјена лексичког окружења функција у JavaScript-у
Нека имамо функцију, која својим резултатом враћа другу функцију:
function test() {
return function() {
}
}
Ако родитељска функција има неке променљиве, онда ће те променљиве бити садржане у лексичком окружењу враћене функције:
function test() {
let num = 1; // променљива родитељске функције
return function() {
// лексичко окружење = {num: 1}
}
}
Напишимо у коду наше враћене функције
console.log, који исписује вредност променљиве
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
Хајде сада да позовемо родитељску функцију
test и њен резултат упишемо
у променљиву func:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
У променљиву func уписаће се враћена
функција. Хајде да позовемо нашу функцију - својим
резултатом она ће исписати садржај променљиве
num:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
let func = test();
func(); // исписаће 1
Ако се пак једноставно покуша исписати променљива
num ван функције - она неће бити доступна:
function test() {
let num = 1;
return function() {
console.log(num);
}
}
console.log(num); // променљива num овде није доступна
Као што видите, локална променљива num
се везала за лексичко окружење наше
функције и сада, позвавши на било ком мјесту у коду
ту функцију, моћи ћемо да добијемо вредност
променљиве num, чак и ако на мјесту
позива сама по себи та променљива није доступна.
Заправо сличан резултат се може
постићи, учинивши променљиву num глобалном:
function test() {
return function() {
console.log(num);
}
}
let num = 1; // глобална променљива
let func = test();
func(); // исписаће 1
Овде, међутим, биће значајна разлика:
у новој варијанти променљиву num се може
мијењати ван функција (јер је глобална),
а у старој - не.
Одредите, без покретања кода, шта ће се исписати у конзолу:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
let func = test();
console.log(func());
Одредите, без покретања кода, шта ће се исписати у конзолу:
function test() {
let num1 = 1;
let num2 = 2;
return function() {
return num1 + num2;
}
}
console.log(test()());
Одредите, без покретања кода, шта ће се исписати у конзолу:
function test() {
let num1 = 1;
return function() {
return num1 + num2;
}
}
let num2 = 2;
let func = test();
console.log(func());
Одредите, без покретања кода, шта ће се исписати у конзолу:
function test() {
let num = 1;
return function() {
return num;
}
}
let num = 2;
let func = test();
console.log(func());