Как вызвать эту.функцию в setTimeout в JS?

#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);
  };
}