2014-01-15 51 views

回答

0

首先,最重要的區別是所執行的實際有用的代碼:

setTimeout ("move()", 3000); // executes move(); - a function call 
setTimeout ("move", 3000); // executes move; - a statement that doesn't do anything 

第二個區別是在執行有用的代碼:

setTimeout ("move()", 3000); // move() gets called at T+3000 
setTimeout (function() {setTimeout ("move()", 3000)}, 100); // move() gets called at T+3100 

最後不同之處在於有用的代碼執行時,但它更加微妙。 JavaScript是單線程的,帶有事件循環。超時可以被視爲事件本身,因爲它們與常規DOM事件一樣參與相同的事件循環。

​​

第一個代碼是直截了當的。當該行被執行時,移動調用被安排執行至少在該時間之後3000ms。 「至少」很重要,因爲如果JS引擎忙於執行其他代碼,事件處理程序可能會被延遲很長時間。

setTimeout (function() {setTimeout (move, 3000)}, 100); 

第二個代碼是大致相同的,相同的調度如之前時間排定執行* 至少* 100ms的所遇到行之後。其中,執行可延遲

一個例子是這樣的一個:

setTimeout (function() {setTimeout (move, 3000)}, 100); 
var d = new Date(); 
while ((new Date()).getTime() - 10000 < d.getTime()) ; // busy wait for 10 seconds 

如前所述,一些代碼(什麼並不重要),預計至少100毫秒後執行。然而,在接下來的10秒內,瀏覽器正忙着執行這段時間。 10秒後,瀏覽器準備好處理其他事件,如預定的代碼。總的來說,在第一次調用setTimeout之後,移動函數被調用(至少)13秒。

總而言之,這些差異是次要的,並且沒有任何東西可以證明在上述簡單場景中對另一個setTimeout調用中的setTimeout調用是合理的。如果程序邏輯要求它,那也沒什麼壞處。

0

有趣的問題,兩個差

首先讓我們定義:

  • 方法A:的setTimeout( 「移動()」,3000);方法B:setTimeout(function(){setTimeout(「move」,3000)},100);

1。javascript vm不同的編譯順序

對於JavaScript來說,嘗試將str編譯爲可運行代碼並在3000毫秒後運行它,而B嘗試立即將該函數編譯爲可運行代碼,但在3000毫秒後運行它。

嘗試下面的演示:

setTimeout ('alert("A")', 3000); 
// "A" alerted after 3000 milliseconds 
setTimeout (alert('B')||function(){alert('C')}, 3000); 
// "B" alerted instantly, while C alerted after 3000 milliseconds 

2.不同使用範圍

B可具有更大的使用範圍,對於B可以通過使用閉合攜帶功能作爲上下文任何變量,但甲只是具有窗口或文檔的上下文。

嘗試以下演示:

(function(){var va = 1; setTimeout ('alert(va)', 3000)}()); 
// run into error:Uncaught ReferenceError: va is not defined after 3000 milliseconds 
(function(){var vb = 1; setTimeout(function(){alert(vb)}, 3000);}()); 
// 1 alerted after 3000 milliseconds