Что выведет код Middle this, call, apply, bind обновлено

Потеря контекста у логгера

Вопрос

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

const logger = {
  mode: 'Dev',
  check() {
    console.log(`This is ${this.mode} mode`);
  },
};

logger.check();

const loggerCheck = logger.check;
try { loggerCheck(); } catch (e) { console.log('TypeError'); }

loggerCheck.apply(logger);

function execute(fn) { return fn(); }
execute(logger.check.bind(logger));

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

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

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

Коротко

Код выведет: This is Dev mode, TypeError, This is Dev mode, This is Dev mode. Почему так Оторванный метод теряет контекст: в строгом режиме this становится undefined и обращение к свойству бросает TypeError. apply вызывает с указанным контекстом сразу, bind возвращает новую функцию с зафиксированным контекстом - она…

Что выведет

This is Dev mode
TypeError
This is Dev mode
This is Dev mode

Разбор

Почему так

Оторванный метод теряет контекст: в строгом режиме this становится undefined и обращение к свойству бросает TypeError. apply вызывает с указанным контекстом сразу, bind возвращает новую функцию с зафиксированным контекстом - она переживает передачу куда угодно. На собеседовании в этой задаче просили сказать, во всех ли четырёх точках будет 'This is Dev mode'.

Вывод

This is Dev mode
TypeError
This is Dev mode
This is Dev mode

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

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