我正在尝试调用我的方法Move();使用setInterval:
在对象MySnake中function Snake()
{
this.Start = function(Speed)
{
this.Movement = setInterval(function(){
this.Move();
},Speed);
}
}
var MySnake = new Snake();
MySnake.Start(400); //Doesn't work
这不起作用。但是当我通过实例'MySnake'调用该方法时:
function Snake()
{
MySnake.Start = function(Speed)
{
this.Movement = setInterval(function(){
MySnake.Move();
},Speed);
}
}
var MySnake = new Snake();
MySnake.Start(400); //Works
我不是那个可以使用的'this'关键字
答案 0 :(得分:3)
这是因为this
是由JavaScript中的调用者定义的。最简单的解决方案是将其存储在另一个变量中:
function Snake()
{
this.Start = function(Speed)
{
var that = this;
this.Movement = setInterval(function(){
that.Move();
},Speed);
}
}
var MySnake = new Snake();
MySnake.Start(400); //Work
这是一个有效的jsfiddle。在您的示例中,内部this
是全局window
。
另一种解决方案是将函数中的this
绑定到本地this
,如此second jsfiddle所示:
function Snake()
{
this.Move = function() { document.body.innerHTML += '.'; };
this.Start = function(Speed)
{
this.Movement = setInterval((function(){
this.Move();
}).bind(this),Speed);
}
}
var MySnake = new Snake();
MySnake.Start(400); //Work
但是这个更难阅读。
答案 1 :(得分:0)
当你这样做时.move(); “this”是传递给setInterval方法的匿名函数,因此会出错。
function Snake()
{
this.Start = function(Speed)
{
var _this = this;
this.Movement = setInterval(function(){
_this.Move();
},Speed);
}
}
var MySnake = new Snake();
MySnake.Start(400)
这将起作用,因为对象的引用是由setInterval的回调创建的闭包捕获的。