У меня был тот же вопрос, но, кажется, нет встроенного решения, поэтому вот быстрый обходной путь, который я пробил вместе:
function setScopedInterval(func, millis, scope) {
return setInterval(function () {
func.apply(scope);
}, millis);
}
использование:
function MyClass() {
this.timer = null;
this.myFunc = function() { console.log('do some stuff'); };
this.run = function() {
this.timer = setScopedInterval(function () { this.myFunc(); }, 1000, this);
};
this.stop = function() { clearInterval(this.timer); };
}
var instance = new MyClass();
instance.run(); // will log to console every second
// until this line is called
instance.stop();
Это относится только к случаю использования, когда вы передаете фактическую функцию, а не строку кода для выполнения.
Что касается вашего вопроса об утечках памяти при использовании этой функциональности: проблема не только в использовании setInterval
, сколько в самих анонимных функциях.
Если вы используете ссылку на объект внутри лямбды, эта ссылка будет хранить указанный объект в памяти до тех пор, пока существует анонимная функция. Я думаю, что функция уничтожается при вызове clearInterval
.
Я не думаю, что есть какая-то польза от присвоения функции сначала переменной, напротив, она создаст другую переменную, содержащую ссылку, которая не будет собираться мусором, пока существует функция anon ...