Ужыванне лексічнага асяроддзя функцый у 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());