Ужыванне лексічнага асяроддзя функцый у JavaScript
Няхай у нас ёсць функцыя, сваім вынікам якая вяртае іншую функцыю:
function test() {
return function() {
}
}
Калі бацькоўская функцыя мае якія-небудзь зменныя, то гэтыя зменныя будуць утрымлівацца ў лексічным асяроддзі якая вяртаецца функцыі:
function test() {
let num = 1; // зменная бацькоўскай функцыі
return function() {
// лексічнае асяроддзе = {num: 1}
}
}
Напішам у кодзе нашай якая вяртаецца функцыі
алерт, які выводзіць у кансоль значэнне зменнай
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());