Объясните значение "this"
В представленном ниже коде мы намерены вызвать obj.go() метод 4 раза подряд.
Но вызовы (1) и (2) работают иначе, чем (3) и (4). Почему?
let obj, method;
obj = {
go: function() { alert(this); }
};
obj.go(); // (1) [object Object]
(obj.go)(); // (2) [object Object]
(method = obj.go)(); // (3) undefined
(obj.go || obj.stop)(); // (4) undefined
Вот как это объясняется.
-
Это обычный вызов метода объекта через точку
., иthisссылается на объект перед точкой. -
Здесь то же самое. Круглые скобки (оператор группировки) тут не изменяют порядок выполнения операций – доступ к методу через точку в любом случае срабатывает первым.
-
Здесь мы имеем более сложный вызов
(expression).method(). Такой вызов работает, как если бы он был разделён на 2 строчки:f = obj.go; // вычисляется выражение (переменная f ссылается на код функции) f(); // вызов функции, на которую ссылается fЗдесь
f()выполняется как функция, без передачи значенияthis. -
Тут похожая ситуация на случай
(3)– идёт потеря значенияthis.
Чтобы объяснить поведение в примерах (3) и (4), нам нужно помнить, что доступ к свойству (через точку или квадратные скобки) возвращает специальное значение ссылочного типа (Reference Type).
За исключением вызова метода, любая другая операция (подобно операции присваивания = или сравнения через логические операторы, например ||) превращает это значение в обычное, которое не несёт информации, позволяющей установить this.