3

以下のコードが出力されます。

timedout false undefined

つまりin methodをthis参照しなくなりました。これはなぜだろうと思いました。theActivityTimertimedOut()

var theActivityTimer = {
    timer: "",          
    active: false,       

    refresh: function () {
        theActivityTimer.timer = setTimeout(
            this.timedOut,
            5000     
        );
    },

    timedOut: function(){
        alert("timedout " +
            theActivityTimer.active + " " + this.active);
    }
}

theActivityTimer.refresh();

http://jsfiddle.net/spiderplant0/nQ4XX/

そして、それを動作させるように指示する方法はありますかthis

4

3 に答える 3

3

この質問は常に聞かれます。使いたくなるfn.bind

var theActivityTimer = {
    timer: null,          
    active: false,       

    refresh: function () {
        this.timer = setTimeout(this.timedOut.bind(this), 5000);
    },

    timedOut: function(){
        alert("timedout " + this.active);
    }
};

fn.bindドキュメントから

呼び出されたときにthisキーワードが指定された値に設定され、新しい関数が呼び出されたときに指定された引数の前に指定された一連の引数がある新しい関数を作成します。


免責事項:

fn.bindECMAScript 5で実装されました。これをブラウザーで使用していて、古いバージョンをサポートする必要がある場合は、es5-shimを確認してください。


于 2013-09-04T17:30:11.307 に答える
3

thisメソッドの呼び出し方法に基づいています。

foo.bar(); // this === foo

var bar = foo.bar();
bar() // this === window (defaults to global object)

後者setTimeoutも効果的です。

代わりに、インスタンス メソッドへの適切な呼び出しを維持する匿名関数を渡すのが一般的です。匿名関数も失われることを覚えておいてください。したがって、ローカル変数にあるthisものを保存する必要がありthisます。これも一般的です。

var self = this;
theActivityTimer.timer = setTimeout(function() {
    self.timedOut()
}, 5000);

コンテキスト ( の値) を操作する方法は他にもありますがthis、おそらくこれが最も理解しやすく、最も広くサポートされています。

于 2013-09-04T17:31:06.563 に答える