@med1um

Как передаётся this в этом простом примере?

в данном простом примере alert() показывает NaN - и понятно почему: потому что в window.koef неопределён, вопрос в другом: как же здесь передаётся this? Если в функции exe() this равен obj, то почему он не передаётся в функцию multiple() ? Откуда multiple() берёт this тогда?

var obj = {koef:22};

    alert( exe.call(obj, 100)  );

    function exe(arg) {
      // ЗДЕСЬ ОЖИДАЕМО: this === obj
      return multiple(arg);
    }

    function multiple(a) {
      // А ЗДЕСЬ ПОЧЕМУ-ТО: this === window
      return a * this.koef;
    }
  • Вопрос задан
  • 174 просмотра
Пригласить эксперта
Ответы на вопрос 2
dimovich85
@dimovich85 Куратор тега JavaScript
https://u-academy.net/
this у обычной функции вычисляется в момент вызова, потому и называется это: "контекст ВЫЗОВА".
Контекст известен в трех случаях:
1. Вызов из объекта: obj.func() или obj['func']() В обоих случаях круглые скобки важны, потому что именно вызов, а не ссылка.
2. Функция вызывается с оператором new. В таком случае, создается новый пустой объект и функция, которая вызывается после new получает ссылку на этот пустой объект в качестве this.
3. Функция вызвана через call, apply или была "забиндина" через bind, в таком случае значение this передается в перечисленные методы в качестве первого параметра.
Во всех остальных случаях this не определен, и ссылается на глобальный контекст, в клиентском js это window, или может быть undefined, если включен strict mode, а также может быть объект DOM, в случае, если используется обычная функция для обработки события, тогда браузер вызывает обработку события в контексте объекта DOM, на котором вешался обработчик.
Ответ написан
Комментировать
lazalu68
@lazalu68
Salmon
This никуда не передается, this это контекст в котором функция объявлена: exe объявлена в глобальном скоупе, поэтому у неё по умолчанию this === window, но вы при вызове явно указываете, что контекст вызова это obj. Multiple тоже объявлена глобально, поэтому по умолчанию у неё this === window
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
18 апр. 2024, в 21:56
2000 руб./за проект
18 апр. 2024, в 21:00
150 руб./за проект