Глобальная переменная счетчика в JavaScript

Вынесем переменную num за функции, тем самым сделав ее глобальной:

let num = 1; // глобальная переменная

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

В этом случае все возвращаемые функции будут изменять эту глобальную переменную и счетчики будут работать уже зависимо друг от друга:

let num = 1;

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

let func1 = test(); // первый счетчик
func1();  // выведет 1
func1();  // выведет 2

let func2 = test(); // второй счетчик
func2();  // выведет 3
func2();  // выведет 4

Почему же наш предыдущий код делал независимые счетчики? Напомню этот код:

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

Дело в том, что переменная num - локальная внутри функции test. Поэтому каждый вызов test порождает свою локальную переменную.

Поэтому возвращаемые функции будут ссылаться каждая на свою локальную переменную функции test. Именно так и достигается независимость работы.

Если же сделать num глобальной переменной - это тоже будет замыканием. Просто лексические окружения возвращаемых функций ссылаются на одну и ту же переменную num - любые изменения с этой переменной будут видны во всех функциях.

Определите, не запуская код, что выведется в консоль:

let counter = 0;
		
function test() {
	return function() {
		console.log(counter);
		counter++;
	};
}

let func = test;

let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();

Определите, не запуская код, что выведется в консоль:

function test() {
	let counter = 0;
	
	return function() {
		return function() {
			console.log(counter);
			counter++;
		};
	};
}

let func = test()();

let func1 = func;
let func2 = func;
func1();
func2();
func1();
func2();

Определите, не запуская код, что выведется в консоль:

function test() {
	let counter = 0;
	
	return function() {
		return function() {
			console.log(counter);
			counter++;
		};
	};
}

let func = test();

let func1 = func();
let func2 = func();
func1();
func2();
func1();
func2();



Чат с GPT Компилятор