Что выведет код Senior Области видимости и замыкания обновлено

Аргументы, замыкание и внешняя переменная

Вопрос

Что выведет код? По строке на каждый вывод.

(function () {
  function modifyItemData(price, platform) {
    price.rub = 5000;
    platform = 'iOS';
    isModified = true;

    return function printItemData() {
      console.log(JSON.stringify(price));
      console.log(platform);
      console.log(isModified);
    };
  }

  let price = { rub: 3500 };
  let platform = 'Android';
  let isModified = false;

  const printItemData = modifyItemData(price, platform, isModified);

  console.log(JSON.stringify(price));
  console.log(platform);
  console.log(isModified);

  price = { usd: 100 };
  platform = 'Web';
  isModified = null;

  printItemData();
})();

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: {"rub":5000}, Android, true, {"rub":5000}, iOS, null. Почему так Разом проверяются три вещи.

Что выведет

{"rub":5000}
Android
true
{"rub":5000}
iOS
null

Разбор

Почему так

Разом проверяются три вещи. Мутация объекта через параметр видна снаружи - ссылка одна. Переприсваивание параметра снаружи не видно - параметр это локальная переменная. Переменная isModified не объявлена параметром, поэтому обращение к ней идёт во внешнюю область, и присваивание меняет ту самую переменную. Замыкание printItemData держит параметры своего вызова, а не свежие значения внешних переменных - поэтому после переприсваивания снаружи оно печатает старое, но isModified читает из внешней области и видит null.

Вывод

{"rub":5000}
Android
true
{"rub":5000}
iOS
null

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.