Почему этот метод Javascript не вызывает сам себя? - PullRequest
5 голосов
/ 09 июня 2011

У меня есть объект JavaScript с привилегированным методом. Когда этот метод завершится, я бы хотел, чтобы он вызывал сам себя (после небольшого тайм-аута) и продолжал работать до бесконечности. К сожалению, метод запускается только дважды, затем он останавливается без ошибок (проверено в Chrome и IE с одинаковыми результатами).

Код выглядит следующим образом:

function Test() {
    // ... private variables that testMethod needs to access ...
    this.testMethod = function() {
        alert("Hello, from the method.");
        setTimeout(this.testMethod, 2000);
    };
}

var myTest = new Test();
myTest.testMethod();

Я ожидал бы получать оповещение каждые две секунды, но вместо этого оно показывает предупреждение только дважды, а затем останавливается. Вы можете увидеть живой пример здесь . Есть идеи, почему это происходит?

Ответы [ 4 ]

10 голосов
/ 09 июня 2011

Поскольку this вне функции не совпадает с this внутри функции.Попробуйте вместо:

function Test() {
    // ... private variables that testMethod needs to access ...
    var me = this;
    this.testMethod = function() {
        alert("Hello, from the method.");
        setTimeout(me.testMethod, 2000);
    };
}
6 голосов
/ 09 июня 2011

Когда вы впервые вызываете его с помощью «myTest.testMethod ();» ключевое слово "this" является связующим звеном с вашим объектом "myTest", когда время ожидания срабатывает, объект "window" связывается с ключевым словом "this", а this.testMethod эквивалентен "window.testMethod". Попробуйте:

function Test() {
    // ... private variables that testMethod needs to access ...
    this.testMethod = function() {
        alert("Hello, from the method.");
        setTimeout((function(self){
            return function(){self.testMethod();};
        })(this), 2000);
    };
}

var myTest = new Test();
myTest.testMethod();

Или:

function Test() {
    // ... private variables that testMethod needs to access ...
    this.testMethod = function() {
        alert("Hello, from the method.");
        var self = this;
        setTimeout(function(){self.testMethod();}, 2000);
    };
}

var myTest = new Test();
myTest.testMethod();
4 голосов
/ 09 июня 2011

Попробуйте

function Test() {
    // ... private variables that testMethod needs to access ...
    this.testMethod = function() {
        alert("Hello, from the method.");
        var self = this;
        setTimeout(function() { self.testMethod(); }, 2000);
    };
}

или используйте setInterval .

3 голосов
/ 09 июня 2011

потому что this в вашем setTimeout относится к локальной функции testMethod, а не Test - по сути, вы говорите setTimeout( testMethod.testMethod, 2000 )

function Test() {
    // ... private variables that testMethod needs to access ...
    var self = this;
    self.testMethod = function() {
        alert("Hello, from the method.");
        setTimeout(self.testMethod, 2000);
    };
}

var myTest = new Test();
myTest.testMethod();
...