Примјена лексичког окружења функција у JavaScript-у

Нека имамо функцију, која својим резултатом враћа другу функцију:

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

Ако родитељска функција има неке променљиве, онда ће те променљиве бити садржане у лексичком окружењу враћене функције:

javascriptfunction test() {
  let num = 1; // променљива родитељске функције
  
  return function() {
    // лексичко окружење = {num: 1}
  }
}

Напишимо у коду наше враћене функције console.log, који исписује вредност променљиве num:

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

Хајде сада да позовемо родитељску функцију test и њен резултат упишемо у променљиву func:

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

let func = test();

У променљиву func уписаће се враћена функција. Хајде да позовемо нашу функцију - својим резултатом она ће исписати садржај променљиве num:

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

let func = test();
func(); // исписаће 1

Ако се пак једноставно покуша исписати променљива num ван функције - она неће бити доступна:

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

console.log(num); // променљива num овде није доступна

Као што видите, локална променљива num се везала за лексичко окружење наше функције и сада, позвавши на било ком мјесту у коду ту функцију, моћи ћемо да добијемо вредност променљиве num, чак и ако на мјесту позива сама по себи та променљива није доступна.

Заправо сличан резултат се може постићи, учинивши променљиву num глобалном:

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

let num = 1; // глобална променљива
let func = test();
func(); // исписаће 1

Овде, међутим, биће значајна разлика: у новој варијанти променљиву num се може мијењати ван функција (јер је глобална), а у старој - не.

Задание 1

Одредите, без покретања кода, шта ће се исписати у конзолу:

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

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

Одредите, без покретања кода, шта ће се исписати у конзолу:

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

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

Одредите, без покретања кода, шта ће се исписати у конзолу:

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

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

Одредите, без покретања кода, шта ће се исписати у конзолу:

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

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