2013-12-20 40 views
1

執行時,Javascript是單線程。 因此,有一段代碼在有空閒資源時執行。 但是,考慮一段代碼是什麼?執行開放時

聲明:

var a = null; 

{ 
    a(); 
    b(); 
    c(); 
} 

我不知道什麼時候就成爲一個觸發事件回調的可能開通時,該事件已結束之前發生f()執行?

function f(){ 
    a(); 
    b(); 
    asyncDef(); 
    c(); 
    d(); 
} 

直到f()被execuded還是讓我們說c()完成後? 什麼時候會是第一個可能的開場?

+1

標題幾乎聽起來像是如果你是一個失業的execution子手,等待什麼。 – DrCord

+0

*「直到'f()'被執行或者在'c()'完成後說'?*爲什麼會在'c()'之後?你是不是指'd()'?在執行任何異步操作之前,任何代碼的同步流程都需要完成。 –

+0

我的意思是這個事件發生在'c()'執行的時候,所以在'c()'後面執行的異步代碼或者線程仍然被'f()'佔據' – kidwon

回答

1

代碼的任何同步流程都需要在任何異步執行之前完成。在你的f()例如,f()將需要完全完成,包括對每個函數內部的調用。但是,如果其中一個調用觸發異步事件,那麼異步代碼不會延遲f();的其餘部分,也不會延遲當前正在等待的異步代碼。

1

一段代碼是語句和塊。我可以想到的最好的解釋方法是:在瀏覽器中使用開發工具並逐步瀏覽代碼。 「一段代碼」將成爲某個事件發生時您獲得的所有代碼。

如果javascript在頁面上內聯,它將被解析並作爲「一段代碼」執行。當事件發生時,回調函數作爲一段代碼執行。

一旦你在執行上下文中,所有事情都會同步發生,並且一個開放將不可用,直到該部分完成。例如:

function f() { 
    var d = new Date().getTime(), 
     later = d + 5000; 

    //Execute code as soon as there is an "opening" 
    setTimeout(function() { 
    alert("There was an opening."); 
    }, 0); 

    //Simulate work being done for 5 seconds. 
    while (d < later) { 
    d = new Date().getTime(); 
    } 

    //implicit return here. 
} 

f(); 

您可以看到代碼(本例中的函數f)正在使用資源,直到d超過後面的變量。 setTimeout將匿名函數推入事件隊列,並在資源空閒時執行(主要在f完成後)。你可以看到時間約爲5秒。

Async JavaScript是一本簡短但很豐富的書,解釋了很多這些工作。 John Resig's blog在解釋定時器方面也做得很好(你可以擴展瀏覽器事件的想法)。