Способы вывести 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 приводит к ошибке.
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().