Задать вопрос
xXRustamXx
@xXRustamXx

Почему this является undefined?

Есть функция конструктор
function Request() {
    this.state = 'ready';
}

Request.prototype.start = function() {
    console.log(this.state, 'show this state');
};

Создаю экземпляр и вызываю функцию callStart
const req = new Request();

function callStart(func) {
  console.log(func === req.start); // true
  func();  // undefined "show this state"
}

callStart(req.start);

Почему потерялся контекст this в prototype.start? В фукнции callStart я стравниваю методы и они равны, если в callStart в качестве параметра передать req и вызвать req.start()
const req = new Request();

function callStart(reqParam) {
  reqParam.start(); // ready show this state
}

callStart(req);

То с this все нормально.
Что эта за магия JavaScript-а?!
  • Вопрос задан
  • 136 просмотров
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
@kova1ev
Упрощенно, можно представить это как-то так:

Есть ячейка памяти где хранится какой-то объект и есть указатель на нее (переменная). И есть ячейка памяти где хранится какая то функция с this внутри и есть указатель на нее (тоже можно сказать переменная, но выглядит она как-то так - myObj.func). Когда ты выполняешь вызов функции через точку - myObj.func() интерпретатор видит контекст в котором запускается функция и откуда нужно брать значение для this.

Но когда ты передаешь в другую функцию в параметрах что-то вроде myObj.func то передается только указатель на ячейку памяти с функцией, контекст теряется, и соответственно переданная сущность запускается не как метод объекта, а как обычная функция, у которой this будет undefined

А во втором случае ты как раз передаешь в параметрах указатель на сам объект, а не его метод, а метод вызываешь потом в контексте этого объекта, поэтому все работает.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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