Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ООП. Почему this = undefined? (https://javascript.ru/forum/misc/78965-oop-pochemu-%3D-undefined.html)

Xopc11 29.11.2019 02:53

ООП. Почему this = undefined?
 
Доброго времени суток. Столкнулся с такой проблемой... Я даже не знаю как ее описать и посему не могу загуглить. Почему-то 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-m...-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

Цитата:

Сообщение от рони (Сообщение 516431)
Xopc11,
строка 16
}.bind(this),1000);

Да. Ваш вариант удобнее будет)
Спасибо. Как закрыть тему?

рони 29.11.2019 08:35

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


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