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

Как вызвать метод объекта из метода объекта?

Всем привет!
Столкнулся с пренеприятнейшей проблемой: при запуске этого кода хром мне радостно сообщает, что this.show() is not a function.
var Timer = {
	elem: "",
	seconds: 0,
	minutes: 0,
	
	tick: function() {
		this.seconds++;
		if (this.seconds == 60) {
			this.minutes++;
			this.seconds = 0;
		}
		if (this.minutes == 60) {
			this.minutes = 0;
		}
		this.show();
	},

	show: function() {
		let output = (Timer.prefInt(this.minutes, 2) + ":" + Timer.prefInt(this.seconds, 2));
		$(this.elem).html(output);
	},

	init: function(element, interval) {
		this.elem = element;
		setInterval(this.tick, interval);
	},

	//support
	prefInt: function (number, len) {
	    var result = "" + number;
	    while (result.length < len) {
	    	result = "0" + result;
	    }
	    return result;
	} 
}

Вопрос в следующем: я открыл доселе неизвестный it-сообществу баг или где-то далеко по мне плачет один учебник по js?
Все this поменять на Timer не мог, поскольку их может быть несколько.
  • Вопрос задан
  • 153 просмотра
Подписаться Простой Комментировать
Решения вопроса 2
0xD34F
@0xD34F Куратор тега JavaScript
я открыл доселе неизвестный it-сообществу баг...

Ага, щас. Десять багов.

... или где-то далеко по мне плачет один учебник по js?

Так точно.

Замените setInterval(this.tick, interval); на

setInterval(this.tick.bind(this), interval);

или на

setInterval(() => this.tick(), interval);
Ответ написан
Комментировать
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Вот тут
setInterval(this.tick, interval)
вы теряете this. Вот так
setInterval(this.tick.bind(this), interval)
UPD: вот, прочитайте все это
https://learn.javascript.ru/object-methods
https://learn.javascript.ru/call-apply
https://learn.javascript.ru/bind
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@svsteem
фронтенд разработчик
Можно еще вот так:
setInterval(function() { this.tick } ,interval)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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