0

_this などの変数を作成して this に割り当てると、現在のバージョンの this への参照ではなく、クロージャーとしてキャプチャされます。なんで?

コード例:

var AnimCore = (function () {
    function AnimCore(ctx) {
        this.ctx = ctx;
    }
    AnimCore.prototype.beginAnimation = function () {
        this.animLoop();
    };
    AnimCore.prototype.animLoop = function () {
        var _this = this;
        this.ctx.drawSomething(); // removed actual drawing code, this is a proxy for it.
        window.setTimeout(function () {
            _this.animLoop();
        }, 1000 / 60);
    };
    return AnimCore;
})();

この場合、_this は、関数が呼び出されるたびに新しい this ではなく、最初の this にバインドされます。なんで?

[更新]匿名関数でクロージャーが発生していることを理解しました。これが、_thisが常に同じものを参照する理由です。ただし、次の質問は、なぜ this.ctx が毎回機能するのかということです。匿名関数を使用しないと、初めて失敗します。

4

1 に答える 1

1

this特殊変数です。this内部で関数を呼び出すときにコンテキストが決定されるため、特別です。

ただし、thisクロージャー内で変数に代入する場合:

var myFunc = (function () {
    var staticThis = this;
    return function () {
        staticThis.doStuff();
    };
}).call(myObj);

私がしたことを見ますか?
という変数がstaticThisあり、明示的に と等しくなるように設定していますmyObj。キーワード用に保存されるの「魔法の」動的コンテキスト解決を保持するのではなく、 の値 (たまたま特定のオブジェクトへのポインター) を保持し
staticThisますthisthisthis

于 2012-11-13T08:34:25.580 に答える