Консоль последовательно выведет 2, 3, 4, 2. fun1 хранит состояние первого вызова outer, а fun2 получает независимую переменную a со стартовым значением 1.
Что покажет консоль после вызова вложенных функций
Консоль последовательно выведет 2, 3, 4, 2. fun1 хранит состояние первого вызова outer, а fun2 получает независимую переменную a со стартовым значением 1.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой результат будет напечатан в консоль при последовательных вызовах функций.
function outer() {
let a = 1;
return function inner() {
a++;
console.log(a);
};
}
let fun1 = outer();
fun1();
fun1();
fun1();
let fun2 = outer();
fun2();
Ответ
Консоль последовательно выведет 2, 3, 4, 2. fun1 хранит состояние первого вызова outer, а fun2 получает независимую переменную a со стартовым значением 1.
В каждом outer создаётся новое лексическое окружение. inner замыкает именно его a и сначала увеличивает значение, затем печатает. Возврат из outer не уничтожает a, пока на неё ссылается доступная функция.
Три вызова fun1 используют одно окружение; вызов outer для fun2 создаёт другое. Если бы a была объявлена вне outer, оба счётчика могли бы разделять одну переменную, но в данном коде этого нет.