Пожалуйста, объясните это упражнение по закрытию Javascript

Я - javascript noob, пытающийся обернуть голову вокруг упражнения закрытия ниже.

Теперь я знаю, что результат - 122. Может ли кто-нибудь пройти меня через это шаг за шагом (что передается чему), так что я могу понять, как работают замыкания?

var hidden = mystery(3);
var jumble = mystery3(hidden);
var result = jumble(2);

function mystery ( input ){
  var secret = 4;
  input+=2;
  function mystery2 ( multiplier ) { 
    multiplier *= input;
    return secret * multiplier;
  }
  return mystery2;
}
function mystery3 ( param ){
  function mystery4 ( bonus ){
    return param(6) + bonus;
  }
  return mystery4;
}

Ответ 1

Чтобы понять это, вы должны знать, в чем разница между вызовом функции и ссылкой на функцию. Как и как области работают в javascript.

Предполагая, что вы знаете это, позвольте объяснить.

Итак, у вас сначала есть переменная hidden, которой присваивается значение mystery(3). Поэтому сразу посмотрите на функцию mystery и посмотрите, что она возвращает. он возвращает ссылку во внутреннюю функцию mystery2. Итак, теперь hidden содержит ссылку, что означает, что у нее нет фактического числового значения. После вас есть второе объявление переменной var jumble = mystery3(hidden);. Теперь, чтобы узнать, что у вас есть jumble, вам нужно посмотреть на функцию mystery3 и значение, которое оно возвращает. Он снова возвращает ссылку на внутреннюю функцию mystery4. Итак, теперь две переменные, которые у вас есть, содержат ссылки на внутренние функции замыканий mystery и mystery3.

Теперь давайте посмотрим на var result = jumble(2). Выполнение jumble(2) является фактическим вызовом функции для функции, в которой jumble содержит ссылку, которая равна mystery4. Когда mystery4 запускается, вы видите, что для него требуется параметр bonus, который будет 2 указан в строке var result = jumble(2). Он возвращает param(6) + bonus. bonus 2, ok, но что такое param(6)? Это значение, указанное в jumble: hidden, которое было ссылкой на mystery2, помните? Таким образом, запуск param(6) выполнит mystery2 с параметром 6

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

Выполнение var result = jumble(2) даст нам возвращаемое значение param(6) + 2, чтобы получить param(6), идем в mystery2 с multiplier = 6, где мы устанавливаем multiplier = 6 * input. Наш вход равен 3+2=5, поэтому multiplier становится 6*5=30, а в качестве возвращаемого значения мы умножаем это на 4, что является нашим var secret. К концу выполнения mystery2 мы имеем значение 120, которое возвращается в наш param(6) в mystery4. И если вы помните, что наш bonus был 2, 120+2=122 Voila!

У меня такое чувство, что я не очень хорошо объяснял это, но это, вероятно, лучшее, что я мог сделать. Надеюсь, что это помогло!