Что такое this в JavaScript?
Что такое this в JavaScript? Постараемся ответить своими словами:
— this — это ссылка на текущий объект, в котором этот самый this и упоминается;
— this — это ссылка на объект, указанные перед точкой свойства или метода;
— this — это ссылка на этот новый объект, созданный с помощью конструктора (класса).
Давайте рассмотрим пример конструктора, который создаёт новый объект, добавляя в него методы:
1 2 3 4 5 6 7 8 9 10 11 12 13 | "use strict" function Machine(power) { this.power = power; this.hi = function () {alert("result for THIS: " + this.power)}; // (1) var self = this; function priv() {alert ("result for SELF: " + self.power)}; // (2) this.hello = function () { priv() }; }; var machine = new Machine(10); machine.hi(); machine.hello(); |
Machine — это конструктор, который при вызове создаёт объект и записывает ссылку на него в переменную machine. В строке (1) метод hi выводит сообщение со значением свойства power.
Свойство power и метод hi имеют один и тот же this — ссылку на новый объект, который будет создан конструктором Machine.
Здесь всё понятно, поэтому смотрит на cтроку (2): в функции priv() вместо this.power мы указали self.power. Зачем?
Дело в том, что на момент инициализации функции priv() в строке (2) её значение this не определено (для режима «use strict») либо равно window (без «use strict»), т.е также не определено! С этой целью мы умышленно создали переменную self и записали в неё ссылку на текущий объект, который создаст конструктор. Теперь всё ОК — функция priv() отобразит значение свойства power в нужном нам контексте.
Конечно, вместо self мы могли бы использовать методы call/apply/bind для строгой привязки контекста, например priv.call(this). Но описанное решение с self является более простым!