2012-12-13 71 views
1

1)有人可以說明setTimeout如何在執行線程方面起作用。setTimeout的執行上下文(JavaScript)

考慮:

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

所有對setTimeout的調用都不會執行任何操作。您將「foo」作爲**字符串**傳遞,這將被解釋爲意味着您需要一個其主體看起來像字符串內容的函數。 – Pointy

+1

查看MDN:https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout#The_.22this.22_problem – Blender

+0

'setTimeout'的上下文是'window',使用'這'來自函數緩存之前。 – elclanrs

回答

0

至於我能記得:

var me = this; 
me.f(); 

(這可能會改變其在另一個上下文中的含義)。

+0

概念上是的,但請填寫函數表達式和對'setTimeout'的調用。 – Bergi

7

請閱讀@DaveAnderson建議的文章。

至於其他的東西,則的setTimeout/setInterval的有兩種形式:

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); 

要修復功能的情況下,使用綁定方法:

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(); 
+1

我建議的文章是John Resig的[JavaScript JavaScript定時器如何工作](http://ejohn.org/blog/how-javascript-timers-work/),但答案已被版主刪除,希望提供此評論是合適的。 –

+0

最後一種方法很有意思 – Martian2049