我有这段代码,并抛出以下错误:

            this.modifyAspect('health');
                 ^
TypeError: Object #<Timer> has no method 'modifyAspect'
    at Timer.tick (/Users/martinluz/Documents/Nodes/societ/node_modules/societal/societal.js:93:9)
    at Timer.exports.setInterval.timer.ontimeout (timers.js:234:14)


我尝试将modifyAspects()分别称为Societ.modifyAspectsthis.modifyAspects()modifyAspects(),但只有错误。任何帮助或建议,表示赞赏...

这是代码:

  var Societ = function(inboundConfig){

    this.population = undefined;
    this.owner_id =  undefined;
    this.owner_name = undefined;
    this.config = inboundConfig;
    this.aspects = {
        education:{
            facilities: undefined,
            rating: undefined
        },
        health: {
            facilities: undefined,
            rating: undefined
        }
    };

    this.modifiers = {
        health: 1,
        education: 2,
        population: 2
    };

    this.tickio = function(){
        console.log('tickio');
    }

    return{
        config: this.config,
        bootstrap: function(){
            this.owner_id = this.config.owner_id;
            setInterval(this.tick, 10000); /*** Problematic line ***/
        },
        yield: function(){

            console.log(this.population);
        },
        getOwnerId: function(){
            return this.owner_id;
        },
        modifyAspect: function(aspect){
            console.log('Modifying aspect: '+aspect);
        },
        tick: function(){
            console.log('Ticking!');
            this.modifyAspect('health');
            console.log('Recalculate education');
            console.log('Recalculate population');
        },

    }
}

最佳答案

您需要将传递给setInterval的函数绑定到正确的上下文:


setInterval(this.tick.bind(this), 10000);


这将定义this中的this.tick实际指向的内容,如果不绑定,它将在计时器的上下文中运行(处理setInterval),如您在错误中所注意到的。

09-25 20:10