4

クラスの特定の関数内setIntervalで、コードの実行を分割するために使用する必要があります。ただし、setInterval関数内では、「this」はクラス「myObject」を参照しなくなりました。setInterval関数内から変数「name」にアクセスするにはどうすればよいですか?

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」と同じ「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

これがプロトタイプでのバインディングの目的です。

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()、標準機能ではなく、他の場所で提供する必要があるという点で不完全であることに注意してください。1 つの方法は、prototype.js Javascript フレームワークを使用することですが、別の方法は、meouw のコード例を使用して自分で行うことです。

あなたが使用しない場合bind()(これは気の利いたことだと言わざるを得ません)、djangel の応答は、あなたが行うことができたものであり、私が最も頻繁に行うことです。

于 2009-01-09T22:43:11.630 に答える