#javascript
#javascript
Вопрос:
У меня есть следующий JS:
function TrackTime() {
this.CountBack = function(secs) {
setTimeout(function(){this.CountBack(secs)}, SetTimeOutPeriod);
}
}
Я пробовал это с закрытием (см. выше), а также примерно дюжиной других способов. Кажется, я не могу заставить это работать ни в одном браузере. Функция setTimeout отлично работает, когда не вызывается в функции «класса». Может кто-нибудь, пожалуйста, помочь мне с этим?
Ответ №1:
Это происходит из-за изменения области действия «this» при выполнении функции.
Попробуйте это-этот трюк..
function TrackTime() {
this.CountBack = function(secs) {
var that = this;
setTimeout(function(){that.CountBack(secs)}, SetTimeOutPeriod);
};
}
Ответ №2:
Вы могли бы попробовать это:
var that = this;
this.CountBack = function (secs) {
setTimeout(function () {that.CountBack(secs)}, SetTimeOutPeriod);
}
Ответ №3:
Причина, по которой вы не можете использовать замыкания здесь, заключается в том, что setTimeout запускается из объекта window, поэтому «this» всегда является «window». Здесь вы захотите использовать приложение с частичной функцией, чтобы задать контекст (и, необязательно, некоторые предопределенные параметры!) вашей функции, при сохранении ее в качестве ссылки, чтобы ее можно было использовать в качестве обработчика событий! Здорово, да? Смотрите ниже.
// This will call a function using a reference with predefined arguments.
function partial(func, context /*, 0..n args */) {
var args = Array.prototype.slice.call(arguments, 2);
return function() {
var allArguments = args.concat(Array.prototype.slice.call(arguments));
return func.apply(context ? context : this, allArguments);
};
}