4

在我的某个类的某个函数中,我需要使用setInterval中断代码的执行。但是,在setInterval函数中,“this”不再指代“myObject”类。如何从setInterval函数中访问变量“名称”?

function myObject() {
    this.name = "the name";
}

myObject.prototype.getName = function() {
    return this.name;
}

myObject.prototype.test = function() {
    // this works
    alert(this.name);

    var intervalId = setInterval(function() {
        // this does not work
        alert(this.name);

        clearInterval(intervalId);
    },0);
}
4

4 回答 4

12
myObject.prototype.test = function() {
    // this works
    alert(this.name);
    var oThis = this;
    var intervalId = setInterval(function() {
        // this does not work
        alert(oThis.name);

        clearInterval(intervalId);
    },0);
}

这应该有效。匿名函数的“this”与 myObject 的“this”不同。

于 2009-01-09T20:04:26.007 回答
1

这是原型绑定函数

Function.prototype.bind = function( obj ) {
    var _this = this;
    return function() {
        return _this.apply( obj, arguments );
    }
}
于 2009-01-09T20:32:53.610 回答
0

这就是 Prototype 中的绑定:

function myObject() {
    this.name = "the name";
}

myObject.prototype.getName = function() {
    return this.name;
}

myObject.prototype.test = function() {
    // this works
    alert(this.name);

    var intervalId = setInterval(function() {
        // this does not work
        alert(this.name);

        clearInterval(intervalId);
    }.bind(this),0);
}
于 2009-01-09T20:05:44.210 回答
0

请注意,s13james 的答案是不完整的,因为bind()它不是标准功能,必须在其他地方提供 - 一种方法是使用prototype.js Javascript 框架,而另一种方法是使用 meouw 的代码示例自己完成。

如果您不使用bind()(我必须说这很漂亮),那么 djangel 的响应就是您可以做的,也是我最常做的。

于 2009-01-09T22:43:11.630 回答