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 это просто переменная области видимости функции. Вы должны использовать одну глобальную переменную области видимости вместо создания новой.

Другие вопросы по тегам