Ребята, помогите разобраться! Почему этот код выводит 1, а не 500? Я думал, что когда вызывается функция обратного вызова, она сначала ищет переменную count в контексте func1. Но похоже, что-то работает не так, как я ожидал.
function func1(cb) {
let count = 500;
cb();
}
let count = 1;
function func2() {
console.log(count);
}
func1(func2);
Может кто-то объяснить, что здесь происходит с областями видимости? Я совсем запутался в этих замыканиях.
Всё дело в лексическом окружении, друг! Когда ты объявляешь функцию func2, она запоминает свое окружение - то есть глобальную переменную count со значением 1. И неважно, где ты потом вызываешь эту функцию - она всё равно будет обращаться к той самой глобальной переменной.
а вот если бы ты объявил func2 внутри func1, тогда бы она видела локальную переменную count=500. но в твоём случае func2 ничего не знает про внутренности func1.
попробуй переписать код так, чтобы func2 была внутри func1 - и увидишь разницу! это поможет лучше понять, как работают замыкания в жс.
Тут дело в лексической области видимости. func2 создается в глобальном скопе, где count = 1. Она запоминает это значение, даже когда вызывается внутри func1. Чтобы увидеть 500, можно передать count аргументом в func2 или создать func2 внутри func1. Так работают замыкания - функция сохраняет доступ к переменным там, где была определена, а не где вызвана. Это важный принцип JS, который часто путает новичков.
Дело в том, как работает лексическое окружение в JS. Функция func2 захватывает глобальную переменную count, а не локальную из func1. Это происходит из-за того, где func2 была определена, а не где вызвана. Чтобы получить 500, можно передать count как параметр в func2 или определить её внутри func1. Так работают замыкания - функция помнит свое окружение при создании.