JavaScript

Вопрос про контекст "this"

Если наша функция определена вне объекта obj, почему значением this является наш объект obj?
Saken Jalgasbaev
Saken Jalgasbaev
119
Потому что this в JavaScript является свободным, в том смысле что оно не привязано никакому объекту. Значение this вычисляется именно во время вызова метода объекта.

Например, в коде может быть одна общая функция которая приветствует пользователя со своим именем, этаже функция может быть использована в разных объектах, полный пример есть ниже.

Есть фукнция hello которая вызывает alert и выводит сообщение "Привет, this.name" где this - это текущий объект на котором был вызван метод объекта, name - свойство в котором хранится имя. Далее в коде есть два объекта это mark и david, оба имеют свойство name со своими именами и метод приветствия sayHi.

Когда в коде вызываем mark.sayHi(); вызывается функция hello по ссылке через метод sayHi, в качестве значения this присваивается объект mark, то есть во время вызова this = mark, потому что вызываем метод используя объект mark. Тоже самое происходит и с объектом david, если обратить внимание каждый выводит сообщение со своим именем, потому что this - это объект перед точкой, на котором вызвается метод.

 function hello() { 
alert(`Привет, я ${this.name}!`);
}

const mark = {
name: "Марк",
sayHi: hello
};

const david = {
name: "Дэвид",
sayHi: hello
};

mark.sayHi();
david.sayHi();
Особенность свободного this в JavaScript может иметь свои плюсы и минусы, плюс в том, что можно использовать одну общую функцию для разных объектов в качестве метода и можно взаимстовать метод от другого объекта к другому, а минус в том что такая свобода требует от программиста большой отвественности и внимательности, потому что свободный this может запутать программиста и ввести в заблуждение.

Если нужна более детальная информация о this и о том как оно устроено в JavaScript, ниже есть ссылке, где можно узнать об этом более подробно.

https://learn.javascript.ru/object-methods
https://learn.javascript.ru/reference-type
Игорь Савенко
Игорь Савенко
4 039
Лучший ответ
Потому что функция вызвана внутри объекта. Функции легко меняют контекст в зависимости от места вызова.
Дэн .
Дэн .
81 331
У тебя метод (method) на obj вызывает функцию foo, и в этом случае контекст this передается как ссылка на объект obj, в котором определен метод method.