Why won't this Javascript method keep calling itself?

前端 未结 4 1993
無奈伤痛
無奈伤痛 2021-01-18 14:12

I have a JavaScript object with a privileged method. When this method has completed, I would like it to call itself (after a small timeout) and continue running indefinitely

相关标签:
4条回答
  • 2021-01-18 15:04

    Because this outside the function is not the same as this inside the function. Try instead:

    function Test() {
        // ... private variables that testMethod needs to access ...
        var me = this;
        this.testMethod = function() {
            alert("Hello, from the method.");
            setTimeout(me.testMethod, 2000);
        };
    }
    
    0 讨论(0)
  • 2021-01-18 15:07

    When you first call it with "myTest.testMethod();" the "this" keyword is bond to your "myTest" object, when the timeout fires the "window" object is bond to "this" keyword and "this.testMethod" is equivalent to "window.testMethod". Try:

    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();
    

    Or:

    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();
    
    0 讨论(0)
  • 2021-01-18 15:11

    Try

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

    or use setInterval.

    0 讨论(0)
  • 2021-01-18 15:14

    because the this in your setTimeout is referring to the local function testMethod not Test -- essentially, you are saying 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();
    
    0 讨论(0)
提交回复
热议问题