无法使用'this'调用方法

时间:2014-07-12 10:20:40

标签: javascript methods this

我正在尝试调用我的方法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'关键字

2 个答案:

答案 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的回调创建的闭包捕获的。