Javascript Закрытие. Лексический против контекста функции.
У меня вопрос, почему следующий код печатает 1 вместо 500; Когда вызывается обратный вызов, и он не находит переменную count, он сначала смотрел на контекст func1?
function func1(cb){
let count = 500
cb()
}
let count = 1
function func2() {
console.log(count);
}
func1(func2)
3 ответа
1. func1 (func2)
Вы передаете функцию func2 в качестве аргумента функции func1.
2. let count = 1
Вы объявили глобальную переменную
3. Вы передали func2 в func1 в качестве аргумента, но вы ничего не сделали там. Вы объявили переменную внутри функции, но она все еще выходит за рамки func2
function func1(cb){
let count = 500
cb()
}
4. func2 знает только глобальную переменную count, поэтому она будет поддерживать 1 вместо локальной переменной func1
function func2() {
console.log(count);
}
Это вопрос областей, первый count
не имеет ту же область действия второго, отличается это:
let count = 1
function func2() {
console.log(count);
}
function func1(cb){
count = 500
cb()
}
func1(func2)
Там вы получили то, что вы рассчитывали,
А также, если вы делаете:
let count = 1
function func2() {
console.log(count);
}
function func1(cb){
let count = 500
cb()
}
func1(func2)
Вы создаете новую переменную count, с другой областью действия первого счетчика, то есть она будет печатать 1
Пусть это переменная области видимости. А в func1 это просто переменная области видимости функции. Вы должны использовать одну глобальную переменную области видимости вместо создания новой.