Antonoff
@Antonoff
Разработчик

Почему в ответе выходит 122?

Есть код, никак понять не могу, почему 122 в ответе выходить, если делать alert(result);

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;
}

var hidden = mystery(3);
var jumble = mystery3(hidden);
var result = jumble(2);
  • Вопрос задан
  • 192 просмотра
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Задачка на каррирование и понимание работы областей видимости и цикла жизни переменных.

Функции mystery и mystery3 возвращают функции, которые имеют доступ к переменным родительского скоупа. Функция создается каждый раз при вызове функций mystery/mystery3 потому не возникает проблем с повторным вызовом.

Переменные живут пока на них хоть кто-то ссылается. В вашем примере на них ссылаются возвращаемые функции, и пока они не отработают, данные нам все еще доступны. Хоть вам может и казаться что после завершения работы функции они исчезают в небытие.

Вот собственно и все.
Ответ написан
@werdon
Web Developer
я извиняюсь а что именно не так??
После
var hidden = mystery(3);в hidden находится метод mystery2 + в области где метод описан, находится в памяти secret = 4 и input = 5;
После
var jumble = mystery3(hidden); в jumble находится метод mystery4 а также переменная param
Работа последнего метода
var result = jumble(2);
Методу mystery4 передается параметр 2. Далее в методе извлекаем параметр param - который висит в памяти. Param - является некой ссылкой на метод. mystery2, колорому передано 6.
То есть, если явно пересмотреть работу последнего метода var result = jumble(2); , то будет следующее:
mystery4(2)
mystery2(6)
6 * 5
30 * 4
120 + 2
= 122
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы