Аргументы, замыкание и внешняя переменная
Вопрос
Что выведет код? По строке на каждый вывод.
(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
Разбор
Почему так
Разом проверяются три вещи. Мутация объекта через параметр видна снаружи - ссылка одна. Переприсваивание параметра снаружи не видно - параметр это локальная переменная. Переменная isModified не объявлена параметром, поэтому обращение к ней идёт во внешнюю область, и присваивание меняет ту самую переменную. Замыкание printItemData держит параметры своего вызова, а не свежие значения внешних переменных - поэтому после переприсваивания снаружи оно печатает старое, но isModified читает из внешней области и видит null.
Вывод
{"rub":5000}
Android
true
{"rub":5000}
iOS
null
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.