Вход

Просмотр полной версии : ООП. Почему this = undefined?


Xopc11
29.11.2019, 02:53
Доброго времени суток. Столкнулся с такой проблемой... Я даже не знаю как ее описать и посему не могу загуглить. Почему-то this перестает определяться внутри функций в методах класса.

Пример на котором я тренируюсь:

class Interval {
constructor(x){
this.End=x;
this.myInterval=' ';
}
startInterval(){
console.log(this.End);
this.myInterval=setInterval(function(){
console.log(this.End);
if(this.End<10){
this.End++;
}
else{
this.stopInterval();
}
},1000);
}
stopInterval(){
clearInterval(this.myInterval);
}
}

let interval = new Interval(1);
interval.startInterval();


Когда запускается startInterval() this.End= равен переданной 1, но после начала "setInterval(function()" this.End уже undefined.
7я строка в консоль выводит 1.
9я выводит undefined;
А stopInterval() вообще убивает скрипт "this.stopInterval is not a function". Приходится его комменить.

Я так понимаю это связано с тем, что this переопределяется внутри функции. Как в js получить this.End и stopInterval() внутри setInterval(function(){ ?

laimas
29.11.2019, 03:49
https://learn.javascript.ru/object-methods#this-ne-yavlyaetsya-fiksirovannym
https://learn.javascript.ru/bind#solution-2-bind

Xopc11
29.11.2019, 05:00
Спасибо за ссылки, но понятнее не стало если честно.

Я придумал другой способ. Привязывать контекст к переменной и уже через нее обращаться к свойству.

this.End и this.stopInterval() я заменил на self.End и self.stopInterval(), а сам self объявил в начале метода простым let self = this; .

Не знаю правильно ли так делать, но вроде работает )

рони
29.11.2019, 07:46
Xopc11,
строка 16
}.bind(this),1000);

Xopc11
29.11.2019, 08:21
Xopc11,
строка 16
}.bind(this),1000);
Да. Ваш вариант удобнее будет)
Спасибо. Как закрыть тему?

рони
29.11.2019, 08:35
Xopc11,
здесь не закрывают темы, это позволяет предложить другие возможные решения или уточнить детали, достаточно сообщения что вам помог тот или иной ответ в теме.