2013-08-29 84 views
6

我試圖理解延遲是如何工作的,所以他們都使用setTimeout。從this questions使用爲什麼在推遲使用setTimeout

this.callbacks;// array of functions reference 
this.callbacks.forEach(function(callback){ 
    window.setTimeout(function(){ 
      callback(data); 
    },0); 
}); 

一例setTimeout

resolve: function (data) { 
    this.promise.okCallbacks.forEach(function(callback) { 
     window.setTimeout(function() { 
     callback(data) 
     }, 0); 
    }); 
    }, 

什麼是由setTimeoutcallback();callback.call();

回答

10

這樣做的原因是爲了讓javascript線程有機會觸發隊列中可能正在等待的任何其他事件。

Javascript是單線程的。如果事件被觸發,它只能在當前運行的代碼完成時運行。

使用setTimeout以零延時有效地告訴JS解釋了callback函數調用是一個新的上下文,而如果您當前的代碼塊已完成部分。這意味着JS會在調用callback()之前檢查是否需要處理其他事件。

雖然這可能被立即打電話耽誤callback()本身,這可以很好的爲您的網站的整體表現:

可能需要處理其他事件包括點擊事件和其他UI觸發器。如果你不給他們一個執行的機會,它可能會讓你的用戶界面顯得呆滯或不響應。

2

setTimeout運行調用循環功能的時間已經過去之後之間不同 JavaScript過程是免費的。

使用call會立即運行回調並阻止其他一切。

+0

但時間設置爲0 –

+0

@ Moein7tl:其實沒有到超時,這是大於0的下限(IIRC它像4毫秒流行的瀏覽器)。因此0意味着「只要你能夠接近它」。據推測,使用零超時的人知道這一點,並故意這樣做。 – Jon

+1

@ Moein7tl - 是的,注意後,我說:「時間已經過去。」我說**「和」 **。 – Quentin

2

setTimeout(func,0)不立即被調用。

它只是模擬一個帶回調的異步函數。通過的setTimeout()執行

function asyncFunc(callback) { 
    console.log("step1"); 
    setTimeout(callback,0); 
    console.log("step2"); 
} 

asyncFunc(function() {console.log("async step")}); 
/* output: 
step1 
step2 
async step 
*/ 

https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

代碼是在一個單獨的執行上下文中運行,從它被調用

所以它運行在單獨的執行上下文的功能,但在執行它之前,JavaScript應該結束當前的執行,因爲在單線程上運行javascript。

在當前執行過程中有多少時間無關緊要,因爲它必須在執行另一個任務之前結束。

如果您在任務結束前有無限循環,例如,您的回調將永遠不會被調用。

1

setTimeout()允許您註冊一個函數,在經過指定的時間量後調用一次。

Window對象的setTimeout()方法安排一個函數,在指定的毫秒數後經過一段時間運行。 setTimeout()返回一個值,該值可以是 傳遞給clearTimeout()以取消預定功能的執行。

如果您撥打setTimeout()時間爲0毫秒,則您指定的功能不會立即被調用 。相反,它被放置在隊列中援引「儘快」 之後的任何目前正在等待事件處理程序完成運行。

相關問題