Значение this
устанавливается в зависимости от того, как вызывается функция. Когда вы вызываете функцию как конструктор, используя new
, this
будет ссылаться на создаваемый объект. Аналогично, когда вы вызываете функцию с точечной нотацией, например run.start()
, this
будет ссылаться на run
. Но к тому времени, когда код, запускаемый setInterval
, называется this
, это уже не означает, что вы думаете. Что вы можете сделать, это сохранить ссылку на this
и затем использовать эту ссылку, как показано ниже:
function Run(){
var self = this;
self.start = function(){
self.interval = setInterval(function() { self.draw(); },1000);
};
self.draw = function(){
//some code
};
}
var run = new Run();
run.start();
Обратите внимание, что вы создали функцию с именем run
и переменную с именем run
- вам нужно дать им разные имена. В моем коде (учитывая, что JS чувствителен к регистру) я изменил имя функции, чтобы оно начиналось с заглавной буквы «R» - это соглашение для функций, предназначенных для запуска в качестве конструкторов.
РЕДАКТИРОВАТЬ: ОК, глядя на другие ответы, я вижу, что просто возможно Я слишком усложнил это и , пока draw()
не требуется доступ к this
это было бы хорошо просто сказать:
this.interval = setInterval(this.draw, 1000);
Но моя точка зрения о том, чтобы не давать вашему конструктору и более поздней переменной одно и то же имя, остается в силе, и я оставлю все self
в нем, потому что это метод, который вам понадобится, если draw()
нужен доступ this
. Вам также нужно будет сделать это таким образом, если вы добавите параметры в функцию draw()
.