Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.11.2019, 02:53
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

ООП. Почему 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(){ ?

Последний раз редактировалось Xopc11, 29.11.2019 в 03:15.
Ответить с цитированием
  #2 (permalink)  
Старый 29.11.2019, 03:49
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

https://learn.javascript.ru/object-m...-fiksirovannym
https://learn.javascript.ru/bind#solution-2-bind
Ответить с цитированием
  #3 (permalink)  
Старый 29.11.2019, 05:00
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

Спасибо за ссылки, но понятнее не стало если честно.

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

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

Не знаю правильно ли так делать, но вроде работает )
Ответить с цитированием
  #4 (permalink)  
Старый 29.11.2019, 07:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Xopc11,
строка 16
}.bind(this),1000);
Ответить с цитированием
  #5 (permalink)  
Старый 29.11.2019, 08:21
Интересующийся
Отправить личное сообщение для Xopc11 Посмотреть профиль Найти все сообщения от Xopc11
 
Регистрация: 01.07.2017
Сообщений: 25

Сообщение от рони Посмотреть сообщение
Xopc11,
строка 16
}.bind(this),1000);
Да. Ваш вариант удобнее будет)
Спасибо. Как закрыть тему?
Ответить с цитированием
  #6 (permalink)  
Старый 29.11.2019, 08:35
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Undefined внутри for-in перебора без hasOwnProperty inpost Общие вопросы Javascript 1 25.12.2016 06:14
success json undefined Vincent Vega jQuery 14 01.07.2016 12:53
Почему не видна переменная? maxapet jQuery 6 10.06.2016 09:44
Почему не работает? qwerty-клавиатура Общие вопросы Javascript 3 22.04.2013 15:53
Почему значения св-в undefined? Bakuryu Events/DOM/Window 4 18.07.2008 19:49