使用setTimeout()时如何使用call()设置`this`的值?

时间:2016-02-23 10:01:06

标签: javascript prototype this settimeout

我在javascript中制作一个简单的游戏。这些是我的玩家方法(有问题的部分是在玩家遇到水后半秒钟调用重置方法):

Player.prototype = {
    update : function(){
        // player control and edge of screen detection
        // TODO factor out hardcoding into sprite width constants
        if (this.keyPressed === 'right' && this.x < 400){
            this.x += 100;
        }
        if (this.keyPressed === 'left' && this.x > 10){
            this.x += -100;
        }
        if (this.keyPressed === 'up' && this.y > 10){
            this.y -= 83;
        }
        if (this.keyPressed === 'down' && this.y < 400){
            this.y -= -83;
        }
        // reset key press
        this.keyPressed = null;

        // if reaches water, reset position
        if (this.y < 60) {
            setTimeout(this.reset, 500);
        }
    },
    reset : function(){
        // TODO factor these constants out
        // console.logs for testing
        console.log("a");
        console.log(this);
        this.x = 200;
        this.y = 405;
        console.log(this.x);
    },
    render : function(){
        ctx.drawImage(Resources.get(this.sprite), this.x, this.y);
    },
    handleInput : function(e){
        this.keyPressed = e;
    }
}

我的问题是,当update调用reset时,关键字this不会绑定到player,而是绑定到window

我可以只在player.x中加入player.yreset,但这样做会不会在原型中编写方法?

我想过使用call()设置this的值,但我似乎无法使用setTimeout()。这不起作用(错误:对象不是函数):

setTimeout(this.reset.call, 500, this);

..这两者都没有(重置正确但立即执行):

setTimeout(this.reset.call(this), 500);

那么如何将this设置为player并将其reset传递给setTimeout

2 个答案:

答案 0 :(得分:6)

您可以使用bind:

setTimeout(this.reset.bind(this), 500);

答案 1 :(得分:5)

你没有。 call立即调用该函数,以便将返回值传递给setTimeout

请改用bindbind生成一个新函数,该函数使用不同的上下文(和默认变量)调用原始函数。

setTimeout(this.reset.bind(this), 500);