0

このコードブロックがあり、次のエラーがスローされます。

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

    }
}
4

1 に答える 1

6

setInterval渡された関数を正しいコンテキスト にバインドする必要があります。

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

thisこれは、実際に何を指すかを定義しthis.tickます。バインドしない場合setInterval、エラーで気付くように、タイマーのコンテキストで実行されます (処理)。

于 2013-03-07T17:56:26.740 に答える