Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ссылочный тип this (https://javascript.ru/forum/misc/78006-ssylochnyjj-tip.html)

Кирилл Margheriti 12.07.2019 17:51

Ссылочный тип this
 
https://learn.javascript.ru/object-m...ssylochnyy-tip

Подскажите чтобы данный пример (первый в разделе Ссылочный тип) сработал нужно
(user.name == "Вася" ? user.hi : user.bye)();
изменить в
user.name == "Вася" ? user.hi() : user.bye();
чтобы всё заработало, правильно ?

рони 12.07.2019 19:13

Цитата:

Сообщение от Кирилл Margheriti
правильно ?

а самому проверить? работает, значит правильно.
var user = {
  name: "Вася",
  hi: function() { alert(this.name); },
  bye: function() { alert("Пока"); }
};

user.hi(); // Вася (простой вызов работает)
// а теперь вызовем user.hi или user.bye в зависимости от имени
user.name == "Вася" ? user.hi() : user.bye();
user[(user.name == "Вася" ? "hi" : "bye")]();//ещё вариант

Кирилл Margheriti 13.07.2019 09:37

Я хотел не могу понять причину по которой первая строка не работает, а вторая работает. Я знаю что там есть объяснение но мне не совсем понятно. Заранее спасибо

j0hnik 13.07.2019 10:59

Кирилл Margheriti,
причина в том что вызов методов обязательно со скобками
хотите чтобы работало без скобок? сделайте геттором

var user = {
  name: "Вася",
  get hi(){ alert(this.name); },
  get bye(){ alert("Пока"); }
};

user.name == "Вася" ? user.hi : user.bye;

рони 13.07.2019 12:46

j0hnik,
вопрос был про this!
Кирилл Margheriti,
(user.name == "Вася" ? user.hi : user.bye)();
потому что эта строка "достаёт" функции из обьекта, так
(user.name == "Вася" ? function() { alert(this.name); } : function() { alert("Пока"); })();

и this тут уже скорее будет window, а user.
на форуме есть несколько тем про this, надо искать, там более профессионально изложено.

Alexandroppolus 14.07.2019 08:52

Цитата:

Сообщение от Кирилл Margheriti
Я хотел не могу понять причину по которой первая строка не работает, а вторая работает.

Как написано в учебнике, выражение user.hi или user['hi'] возвращает не функцию, а связку функция+контекст.
И всё зависит от того, что с этим результатом делается на следующем шаге.
Если делается вызов функции, то контекст используется по назначению, попадает в this. Во второй строке как раз этот случай.
А если любое другое действие, то контекст отлетает, остаётся только функция. Например, у тебя в первой строке действие над результатом user.hi - передача его в операцию ?:


Часовой пояс GMT +3, время: 08:43.