1

1) setTimeout が実行スレッドに関してどのように機能するかを誰かが説明できますか?

検討:

function foo() { alert('foo'); }
function bar() { alert('bar'); }  
setTimeout(foo,1000);
bar();

また

function foo() { alert('foo'); setTimeout(foo,1000); }
function bar() { alert('bar'); }  
setTimeout(foo,1000);
bar();

また

function foo() { alert('foo'); setTimeout(foo,1000); }
function bar() { /* an execution that runs with unknown time */ }  
setTimeout(foo,1000);
bar();

また

function foo() { alert('foo'); setTimeout(foo,1000); }
function bar() { /* some ajax call that reply with unknown time */ }  
setTimeout(foo,1000);
bar();

また

function foo() { alert('foo'); setTimeout(foo,1000); }
function bar() { alert('foo'); setTimeout(bar,1000); }  
setTimeout(foo,1000);
setTimeout(bar,1000);

2) 「この」オブジェクトが setTimeout で機能しない理由と、その問題を回避するために何ができるかを誰かが説明できますか?

4

2 に答える 2

8

@DaveAnderson が提案する記事を読んでください。

他のものに関しては、setTimeout/setInterval には 2 つの形式があります。

setTimeout(arg, timeout)

arg が文字列の場合、実行されるソース コードとして扱われます。これは eval() と同じくらい悪いです。避けてください。

arg が関数の場合、グローバル コンテキストで実行されます。

var Test = function () {
    this.x = 1;
    setTimeout(function () {
        console.log('x: ' + this.x);
    }, 10);
};

var t = new Test();

出力 x: 未定義。

だからあなたがしたいことは次のとおりです:

function foo() { alert('foo'); }
setTimeout('foo()', 1000);

またはそれ以上:

setTimeout(foo, 1000);

関数のコンテキストを修正するには、bind メソッドを使用します。

var Test = function () {
    this.x = 1;
    var f = function () {
        console.log('x: ' + this.x);
    };
    setTimeout(f.bind(this), 10);         // use this as the context
};

var t = new Test();

または手動で行います:

var Test = function () {
    this.x = 1;
    var that = this;
    setTimeout(function () {
        console.log('x: ' + that.x);     // closure: closing over that
    }, 10);
};

var t = new Test();
于 2012-12-13T23:15:20.450 に答える
0

私が思い出せる限り:

var me = this;
me.f();

(これは、別のコンテキストでは意味が変わる可能性があります)。

于 2012-12-13T23:14:22.773 に答える