#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);