вызывающая переменная функция и вызывающая функция напрямую - PullRequest
0 голосов
/ 31 октября 2019

Я изучаю JavaScript с книгой Мэннинга «Программирование с использованием JavaScript» (Джон Ларсен). В главе 11, листинг 11.8, код:

var getCounter = function () {
    var counter = 0;
    var countUpBy1 =  function () {
        counter = counter + 1;
        return counter;
    };  
    return countUpBy1;
};
var count = getCounter();

И я использую jsbin.com для экспериментов и обучения. В консоли:

Q1) почему при вызове count () результат не всегда равен 1? Почему счетчик установлен в 0 в начале, прежде чем countUpBy1, счетчик внутри countUpBy1 также не должен быть равен 0?

Q2), почему вызов getCounter () отличается от count ()? вызов count () даст мне номер (именно этого я и ожидаю), но вызов getCounter () даст мне:

function () {
    counter = counter + 1;
    return counter;
}

Спасибо, что объяснили заранее.

4 / Nov: @DavidFleeman: Правильно ли я понял первый вопрос (прочитал все 3 ссылки, плюс Закрытия JavaScript 101: Что такое замыкание ?, Я никогда не понимал замыкания JavaScript & Закрытия JavaScript, объясненные отправкой пакета по почте :

(мое понимание того, как проходить через закрытие), удалено

12 / Nov: Я никогда не понимал закрытия JavaScript Читать этоСсылка еще несколько раз, и это объясняет лучше, чем я.

1 Ответ

0 голосов
/ 31 октября 2019
  1. Почему вызов count () не всегда равен 1?

Эти вложенные методы создают замыкание, при котором инициализация происходит только один раз, а вложенный внутренний метод возвращается каждый раз. Пожалуйста, прочитайте эту ссылку, чтобы понять:

https://www.w3schools.com/js/js_function_closures.asp

Если вы предпочитаете MDN, используйте ссылку ниже. Тем не менее, приведенная выше ссылка содержит пример, который, как я считаю, соответствует сценарию участника:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

И, что еще более подробно, это, кажется, хорошо продуманное объяснение:

https://blogs.msdn.microsoft.com/ericlippert/2003/09/17/what-are-closures/

Почему getCounter () возвращает объект функции вместо выполнения метода?

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

var getCounter = (function () {
  var counter = 0;
  var countUpBy1 =  function () {
    counter = counter + 1;
    return counter;
  };  
  return countUpBy1;
})();
getCounter();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...