Способы вывести obj.x через функцию с this в JavaScript

Дан код:

function f() { 
  console.log(this.x);
}
const obj = {x: 'bar'};

Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоль значение x из объекта, используя функцию.

Теория: как работает this в задаче

В функции

function f() { 
  console.log(this.x);
}

значение берётся из this, поэтому результат зависит не от имени переменной obj, а от того, какой объект станет this при вызове.

Для обычной функции (не стрелочной) this определяется способом вызова:

  • При вызове как метода obj.f() контекстом становится объект слева от точки, то есть obj.
  • При обычном вызове f() контекст не привязан к obj автоматически.

Строгий режим ("use strict") меняет поведение обычного вызова: при f() значение this становится undefined, и попытка прочитать this.x приводит к ошибке.

При включённом strict mode вызов f() без привязки (call/apply/bind/метод) не просто «не выведет bar», а может завершиться ошибкой из‑за обращения к this.x, когда this равно undefined.

Разбор механизмов: call/apply/bind

Ниже показано, чем отличаются основные корректные подходы — по сути, это разные способы управлять this.

СпособЧто происходитКогда удобно
callНемедленный вызов функции с заданным this и аргументами через запятуюНужно один раз вызвать с контекстом
applyНемедленный вызов с заданным this, аргументы передаются массивомАргументы уже собраны в массив/псевдомассив
bindВозвращается новая функция с «закреплённым» thisНужно сохранить функцию и вызывать позже многократно
Вызов как методаthis берётся из объекта слева от точки в момент вызоваМожно (временно) сделать функцию методом объекта

Отдельные варианты вида

Function.prototype.call.call(f, obj)

нужны главным образом для понимания устройства: call и apply — это методы, которые можно «одолжить», потому что они сами являются функциями.

Кратко: Краткая выжимка: значение obj.x выводится через f только тогда, когда this внутри f указывает на obj; это обеспечивается через call/apply, через bind (создание новой функции), через вызов как метода obj.f().