Пусть у нас есть функция, своим результатом возвращающая другую функцию:
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());