@LitvintsevIgor

Как разобраться с this в javascript окончательно?

Привет, можете пожалуйста объяснить, почему в моем случае в 92 строке this ссылается на window?

63401041d8369096562314.png

На сколько я понимаю, в случае с FD у нас this будет браться из того места, в котором функция была вызвана. Для наглядности я вывел this в 94 строке (то есть именно в том месте, где функция "say" и была вызвана). И в случае с 94 строкой все понятно, в этом месте this ссылается на объект "cat", ну так мы здесь же и вызвали функцию "say" и я никак не могу найти объяснение, почему в 92 строке this ссылается на window, а не на "cat"?

И вообще, вдруг кто может посоветовать какой-нибудь источник, статью, главу в какой-нибудь книге, я не знаю, где очень подробно и хорошо для чайников расписано про this c множеством примеров. Потому что в mdn, learnjavascript, роликах на ютубе (и на русском и на английском) везде рассмотрены относительно простенькие примеры, которые легко логично объясняются. Но стоит попасть на собес, так интервьюер с этим this такое заворачивает, что "не в сказке сказать ...". Поэтому хочу хорошо подготовиться и разобраться уже вообще со всевозможными кейсами, сижу сам себе их придумываю сейчас.

const cat = {
   nickname: "Barsik",
   f() {
     function say() {
       console.log(this); // window WHY?
     }
     console.log(this); // cat OK
     say();
   },
 };

 cat.f();
  • Вопрос задан
  • 312 просмотров
Решения вопроса 4
Alexandroppolus
@Alexandroppolus
кодир
say();

вот здесь ты просто вызвал функцию (не стрелочную), и не передал this

надо так
say.call(this);
Ответ написан
@orzu007
Запомни всегда когда ты у простой функции пытаешься вывести this он будет ссылаться на родителя в данном случае window её родитель, а в случае когда this указывает на объект в котором он лежит, условие такое что он должен быть методом этого объекта.
Ответ написан
Все очень просто.
say это простая функция, у нее глобальный контекст в зависимости от strict mode это undefined или window
Для того, чтобы избежать путаницы, используй strict mode
f это метод, если ты его вызываешь как метод - контекст это родитель, если как функцию, он потеряет контекст
https://developer.mozilla.org/en-US/docs/Web/JavaS...
https://github.com/getify/You-Dont-Know-JS/blob/1s...
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Вот была неплохая статья на Хабре с попытками разобраться с this в JavaScript.
  • Первый случай, метод объекта – при непосредственном получении и вызове делает этот объект this'ом.
  • Второй же случай — функция, внутри другой («да»), не стрелочная, «нет», «нет» ... «нет» — this равен глобальному объекту. Если включить строгий режим, вместо Window получим undefined.

Статья не столько объясняет (объясняет под спойлерами Комментарий), сколько предлагает алгоритм рассуждений, «таблицу умножения» для запоминания — чтобы предсказывать значение this.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы