недоразумение замыканий в JavaScript - PullRequest
0 голосов
/ 29 марта 2019

Я читаю серию книг Вы не знаете js , и у меня есть вопрос, касающийся закрытия .

var a;

function wait() {
  a = 10;

  return setTimeout(function timer() {
    console.log('Hello closure ', a);
  }, 1000)
}

const fn = wait;
fn();
console.log(a);

Если я запросил значение a в консоли без выполнения функции (fn ()), он скажет, что это undefined , что является правильным.

Теперь, если я выполню функцию fn () через 1 секунду, она напечатает Hello Closure 10 Я знаю, что таймер имеет функцию закрытия по ожиданию, поэтому он печатает это значение даже если он выполняется вне лексической области, в которой он был определен.

Но если вывести a значение в консоли сейчас ( после запуска fn () ), оно также выдаст 10 , так что, думаю, это не лексическая область действия , из глобальной области поиска поиск никогда не идет вниз (я имею в виду, что он смотрит глубоко во вложенные функции), он всегда ищет переменные вверх (переходя к объемам функций).

Так что мне интересно, является ли это замыканием или переменная только что получила другое значение после запуска функции, и все?

Надеюсь, это не глупый вопрос, спасибо!

1 Ответ

1 голос
/ 29 марта 2019

Если вы создадите экземпляр переменной внутри функции, это предотвратит изменение глобальных переменных с тем же именем. Я добавил var a = 10 в функцию. Я оставил там глобальную переменную, чтобы вы могли видеть, что теперь она не меняется. Это больше проблема переменной области видимости.

Закрытие работало так, как вы ожидали, просто вы устанавливали глобальную переменную.

var a;
function wait() {
  var a = 10;

  return setTimeout(function timer() {
    console.log('Hello closure ', a);
  }, 1000)
}

const fn = wait;
fn();
console.log(a);
...