2014-09-06 44 views
0

我有兩個函數調用一個接一個,x和y是全局變量。函數,時序,調用順序和全局變量

function setVariables() { 
    x = 2; 
    y = 10; 
}; 

function useVariables() { 
    console.log(x); 
    console.log(y); 
}; 

說我把這兩個函數一個接一個地調用文檔就緒函數。保證在useVariables被調用之前「完成」setVariables?或者,考慮到setVariables可能會很長並且需要一些時間來運行,您是否最終會在useVariables嘗試使用這些全局變量,然後setVariables有機會設置它們?

+2

您能否更具體地瞭解您的真實問題,而不是您想要解決的問題? – raina77ow 2014-09-06 16:51:39

回答

3

JavaScript是單線程的。代碼並行運行是不可能的。這兩個函數將始終按順序執行。

區分並行性異步很重要。

  • 並行是在不同的線程或不同的過程同時運行的代碼的可能性。當你有並行性時,你必須開始擔心競爭狀態和共享狀態的同步。

    作爲一種單線程語言,並行性在JavaScript中不起作用。

  • 非同步是有代碼運行在不可預測的時間不可預測的順序的能力。如果您使用setTimeout或設置AJAX回調或註冊事件處理程序,則您無法保證訂購。例如,當您註冊多個超時回調時,您不應該認爲它們以特定順序執行。

    異步並不一定意味着代碼將並行執行。在其他語言中,它可能會使用JavaScript,但它不會。您不必擔心在一個事件處理程序被其他事件處理程序更改時使用的變量。在您的代碼正在運行時,它只能運行代碼。


Web workers複雜的答案。 Web工作者通過允許在後臺線程中完成工作來提供並行性。不過,這些線程只能通過異步事件與主線程連接。沒有共享數據。主線程不會看到這些後臺線程。它仍然可以安全地假裝世界是單線程的。

+2

所以你可以保證在這裏訂購? 'window.setTimeout(foo,0); window.setTimeout(bar,0);' – 2014-09-06 16:52:45

+2

這不是被問及的問題。問題是在文檔就緒函數中函數被一個接一個地調用。 – 2014-09-06 16:54:14

+0

'+ 1'因爲答案現在解釋異步的方式,讓OP知道你不能**總是**承擔函數調用順序,但對於大多數代碼毫無疑問。 – 2014-09-06 17:10:49

2
setVariables() 
useVariables() 

setVariables()應該並且將在下一行(useVariables())執行之前始終執行並完成。

+1

超時和間隔也不會保證順序,基本上什麼都不「異步」 – 2014-09-06 16:51:35

+0

當然。我忘了提及:) – 2014-09-06 16:52:28

+0

@ raina77ow我們沒有看到OP如何調用它們的代碼;爲什麼我們應該假設沒有? – 2014-09-06 16:54:38