Diameter вернёт 20, perimeter — 4π. Обычный метод читает radius объекта shape, а стрелка захватывает this вызова makeShape, где radius равен 2.
Что вернут diameter и стрелочный perimeter у shape?
Diameter вернёт 20, perimeter — 4π. Обычный метод читает radius объекта shape, а стрелка захватывает this вызова makeShape, где radius равен 2.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В строгом режиме выполните:
'use strict';
function makeShape() {
return {radius: 10,
diameter() { return this.radius * 2; },
perimeter: () => 2 * Math.PI * this.radius
};
}
const shape = makeShape.call({radius: 2});
console.log(shape.diameter());
console.log(shape.perimeter());
Ответ
Diameter вернёт 20, perimeter — 4π. Обычный метод читает radius объекта shape, а стрелка захватывает this вызова makeShape, где radius равен 2.
Strict mode не заставляет стрелку брать this из объекта литерала. При создании она использует лексическое окружение фабрики, вызванной с явным получателем. Чтобы perimeter относился к самому shape, его нужно объявить обычным методом: perimeter() { return 2 * Math.PI * this.radius; }. Тогда оба расчёта будут использовать один radius.