1

再帰的なメソッドを作成しようとしていますが、へのバインドが失われていthisます。これが私の問題を再現する最も簡単な方法です:

var Foo = function() {
    return {
        foo : 'foo',
        bar : function() {
            co​nsole.log(this.foo);
            setTimeout(this.bar, 500);
        }
    }​;
}
var foo = new Foo();
foo.bar();​

それは2回だけ実行されます。最初fooはコンソールにログインし、2回目はログに記録しますundefined。もちろん、グローバルオブジェクトにリセットされたと想定しているためbar、のプロパティではなくなったため、実行されなくなります。this

メソッドと参照を試しvar that = thisましたが、何も変わりません。私も私の声明の上で試しましたが、問題は解決しません。barthat.foothat.barvar that = thisreturn

期待される結果:

foo

foo

foo

foo

... 等々

http://jsfiddle.net/k2hTJ/の例を次に示します。これにより、次のようになります。

foo

未定義

4

3 に答える 3

5

setTimeout現在のスコープでその関数を呼び出しますがthis、グローバルオブジェクトとして使用します。

これを回避する最善の方法は、次のようなことを行うことです。

var that = this;
setTimeout(function() {that.bar.apply(that);},500);
于 2012-12-28T22:46:23.997 に答える
0

これは機能します:

var Foo = function() {
    return {
        foo : 'foo',
        bar : function() {
            co​nsole.log(this.foo);
            setTimeout(this.bar(), 500); //Add '()'
        }
    }​;
}
var foo = new Foo();
foo.bar();​
于 2012-12-28T22:49:10.520 に答える
0
foo = {
    foo: 'bar',
    bar: function() {
        console.log(foo.foo);
        setTimeout(foo.bar, 500);
    }
};
foo.bar();​

これもトリックを行います。

于 2012-12-28T22:54:16.683 に答える