我正在编写一些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.
现在,我的问题是:为什么会这样?我该如何解决?
答案 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);
}