Javascript函数中没有更新变量

时间:2014-06-11 09:33:40

标签: javascript oop

我正在编写一些Javascript项目,并且在变量更新方面存在一些问题。我有这样的功能:

function Bullet(top){
        this.top = top;     
        update();

        function update(){
            this.top -= 5;
            console.log(this.top)
            setTimeout(update, 50);
        }
};

Bullet.prototype.getTop = function(){
        return this.top;
    };

我打电话的时候:

var bullet = new Bullet(300);

我得到300的连续控制台输出。当然,当我反复调用bullet.getTop()时,我也得到结果300.

现在,我的问题是:为什么会这样?我该如何解决?

1 个答案:

答案 0 :(得分:1)

"这"在功能"更新"受限于"更新功能"上下文不是"子弹功能"上下文。所以,当你使用"这个"在函数内部,它与包装函数无关,当你进行更改时,它只适用于函数的本地上下文,其中" this"已被使用。你可以阅读更多关于"这个" here

您可以通过两种方式解决问题

第一种方法是在简单地返回已调用的函数的副本时调用.bind(context)函数,但此副本被绑定到传递的上下文。但是当你使用这种方式时,你必须在定义之后调用它。

this.top = top

var update = function(){
        this.top -= 5;
        console.log(this.top)
        setTimeout(update, 50);
}.bind(this)

update();

或 使用像波纹管这样的JavaScript闭包,你可以定义一个闭包调用它,就是说"那个"并将包装器上下文保存在其中,然后使用"那"在更新功能中。

var that = this;
function update(){
        that.top -= 5;
        console.log(that.top)
        setTimeout(update, 50);
}