2011-02-01 16 views
10

powiedzieć, że mam następujący kod:JavaScript kolejność wykonywania z setTimeout()

function testA { 
    setTimeout('testB()', 1000); 
    doLong(); 
} 

function testB { 
    doSomething(); 
} 

function doLong() { 
    //takes a few seconds to do something 
} 

wykonam testA(). Czytałem, że Javascript jest jednowątkowy. Co dzieje się po upływie 1000 milisekund, gdy zostanie osiągnięty limit czasu dla testB()?

Niektóre możliwości mogę myśleć:

  • testB() jest w kolejce do wykonania po doLong() i cokolwiek innego to nazywa zakończeniu.
  • doLong() jest natychmiast przerywany i rozpoczyna się testB().
  • doLong() ma trochę więcej czasu na wykonanie przed zatrzymaniem (automatycznie lub po monicie użytkownika) i rozpoczyna się testB().
  • doLong() jest wstrzymana, rozpoczyna się testB(). Po zakończeniu testB() wznawia się doLong().

Jaka jest prawidłowa odpowiedź? Czy jest to zależne od implementacji lub część standardu? *

This question jest podobna, ale nie taka sama, o ile wiem.

Wszelkie linki, które możesz polecić, aby lepiej zrozumieć Wydajność JavaScript byłaby doceniana.

Dzięki!

* Tak, wiem, że nie wszystkie przeglądarki przestrzegać norm :(

Odpowiedz

10

Pierwszy swoich domysłów jest prawidłowa: testB() is queued up to execute after doLong() and anything else it called have finished.

Jeśli trwa to dłużej niż jedną sekundę dla testA do końca, testB po prostu trzeba czekać.

Ponadto, należy napisać setTimeout(testB, 1000) zamiast setTimeout('testB()', 1000). Wysyłanie ciąg setTimeout jest, jak za pomocą eval, generally considered evil i sprawi, że będziesz wrogowie;)

+0

Przyszło mi na myśl 'setTimeout (function() {testB(); }, 1000); 'to najlepszy sposób, czy zostałem wprowadzony w błąd? –

+2

@Shadow Wizard: Tak, bardzo wprowadzeni w błąd. O ile mi wiadomo, nie ma różnicy między twoim a moim (z wyjątkiem tego, że mój jest krótszy oczywiście: D). Aby to zilustrować, wyobraźmy sobie, że wyciągnęliśmy wyrażenie do zmiennej: 'var f = function() {testB(); }; setTimeout (f, 1000); '. Nadal to samo znaczenie, ale teraz widać nadmiarowość. – Jakob

+1

Dziękuję, zarówno za odpowiedź, jak i za poradę dotyczącą przekazywania funkcji do setTimeout zamiast String. Wygląda na to, że samouczki, które czytałem, są trochę wątpliwe;) –