Замыкания в JavaScript: контекст лексический или функциональный?

Ребята, помогите разобраться! Почему этот код выводит 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. Так работают замыкания - функция помнит свое окружение при создании.