Понимание области замыкания в JavaScript

#javascript #closures #theory

#javascript #замыкания #теория

Вопрос:

Я читал серию книг «Вы не знаете 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()), она скажет, что оно не определено, что правильно.

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

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

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

Комментарии:

1. Ее значение остается равным 10, потому что вы устанавливаете переменную в глобальной области.

2. function wait() { var a = 10; … ` было бы по-другому…

Ответ №1:

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