Есть ли ссылки на переменные закрытия JavaScript или они содержат свою собственную копию? - PullRequest
0 голосов
/ 13 октября 2018

Я недавно читал о замыканиях, и я немного запутался, поэтому у меня возникло несколько вопросов.

Поэтому я думал о замыкании, как всякий раз, когда вы используете переменную внутри функции, которая находится где-то за пределами вашегонепосредственная лексическая сфера.Другое определение, которое я часто слышу, это: «Сохранение копии переменных в том же состоянии, в каком они были до завершения выполнения функции».

Итак, допустим, у меня есть функция с закрытой переменной:

function foo() {
    var x = 'abc';
    return function() {
        return x;
    }
}

var bar = foo();
console.dir(bar) // [[Scopes]] - 0: Closure { x: 'abc' }

Когда я console.dir и проверяю, что находится внутри замыкания, я вижу, что свойство x имеет значение 'abc'.

Я немного растерялся относительно того, как x остается«Alive» внутри внутренней функции, когда родительские (внешние) переменные функции отбрасываются и сборщик мусора (.. я предполагаю) в javascript сразу после выполнения родительской функции.

Итаккогда я возвращаю определение внутренней функции в переменную bar, я предполагаю, что она также содержит ссылку и формирует замыкание?(Возможно, я ошибаюсь, это то, где я запутался).

Также, когда я формирую замыкание, и замыкание содержит переменные из области видимости его родителя, создает ли оно новую копию этой переменной и сохраняет ее взакрытие или это просто ссылка на переменную извне функции и изменяет ее значение?потому что я думал, что переменная 'x' будет отброшена, как только родительская функция будет выполнена?

Извините за глупый и длинный вопрос, но было бы неплохо, если бы кто-то мог прояснить это abit для меня.

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Внутренняя функция / замыкание содержит ссылку на внешнюю функцию / замыкание.И когда вы возвращаете переменную x, она будет искать свое значение из внешнего замыкания, которое все еще существует.

0 голосов
/ 13 октября 2018

Это на самом деле закрытие.Ваша область действия функции наследует свою внешнюю область, которая наследует ее внешнюю область и так далее.Если в вашей области вы используете какую-либо переменную из внешней области видимости, JS engine увеличивает счетчик ссылок на эту переменную, и поэтому он не удаляется сборщиком мусора (он удаляет переменные, на которые больше нет ссылок, т. Е. Имеет 0 ссылок).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...