Закрытие Javascript - PullRequest
       6

Закрытие Javascript

0 голосов
/ 19 мая 2018

У меня есть вопрос о закрытии в JS.Ниже дано следующее назначение:

function multiplicationParDeux() {
     var chiffre = 10;
     var fonction = function() { console.log(chiffre * multiplicateur); }
     chiffre = chiffre * 2;
     var multiplicateur = 10;
     return fonction;
    }

    var maFonction = multiplicationParDeux();
    maFonction(); //Output: 200

Как получается, что на выходе получается 200?Я объявил свою переменную multiplicateur после закрытия, как часть console.log(chiffre * multiplicateur); распознает переменную multiplicateur?

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Ваша внутренняя функция - fonction перетаскивает с собой запись переменных со своими значениями из своей лексической области (ссылающейся среды), когда она возвращается из включающей ее функции - multiplicationParDeux или выполняется вне своей собственной лексической области.

Когда вы возвращаете fonction, вы можете представить его закрытие как объект со следующими свойствами, который служит связыванием для свободных переменных внутри fonction.

chiffre: 20,
multiplicateur: 10

И каждый разfonction выполняется, он обращается к этому закрытию, если он содержит привязки для своих свободных переменных (chiffre и multiplicateur), и, поскольку это происходит, результат действительно равен 200.

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

0 голосов
/ 19 мая 2018

Закрытие означает не то, что переменные копируются, а то, что функция сохраняет ссылку на внешние переменные области действия.

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