JavaScript jest jednowątkowy i ma synchroniczny model wykonania. Jednowątkowy oznacza, że jedno polecenie jest wykonywane jednocześnie. Synchroniczny oznacza jeden po drugim, tzn. Jeden wiersz kodu jest wykonywany jednocześnie w celu wyświetlenia kodu. Tak więc w JavaScript jedna rzecz dzieje się na raz.
Kontekst wykonania
Silnik JavaScript współdziała z innymi silnikami w przeglądarce. Na stosie wykonawczym JavaScript jest u dołu kontekst globalny, a następnie, gdy wywołujemy funkcje, silnik JavaScript tworzy nowe konteksty wykonania dla odpowiednich funkcji. Gdy wywoływana funkcja kończy działanie, kontekst wykonywania jest wyskakujący ze stosu, a następnie kontekst kontekstu wykonania jest wyskakujący itd. ...
Na przykład
function abc()
{
console.log('abc');
}
function xyz()
{
abc()
console.log('xyz');
}
var one = 1;
xyz();
W powyższym kodzie zostanie utworzony globalny kontekst wykonania, w tym kontekście var one
będzie przechowywany, a jego wartość będzie wynosić 1 ... po wywołaniu wywołania xyz () zostanie utworzony nowy kontekst wykonania i jeśli zdefiniowalibyśmy jakąkolwiek zmienną w funkcji xyz zmienne te byłyby przechowywane w kontekście wykonania xyz (). W funkcji xyz wywołujemy abc (), a następnie tworzony jest kontekst wykonania abc () i umieszczany na stosie wykonania ... Teraz, kiedy abc () skończy, jego kontekst jest wyskakujący ze stosu, a następnie kontekst xyz () jest wyskakujący z stos, a następnie kontekst globalny zostanie wyświetlony ...
Teraz o asynchronicznych wywołaniach zwrotnych; asynchroniczny oznacza więcej niż jeden na raz.
Podobnie jak stos wykonawczy, istnieje kolejka zdarzeń . Gdy chcemy otrzymywać powiadomienia o zdarzeniu w silniku JavaScript, możemy odsłuchać to zdarzenie, a to zdarzenie jest umieszczane w kolejce. Na przykład zdarzenie żądania Ajax lub zdarzenie żądania HTTP.
Ilekroć stos wykonawczy jest pusty, jak pokazano w powyższym przykładzie kodu, silnik JavaScript okresowo sprawdza kolejkę zdarzeń i sprawdza, czy istnieje jakieś zdarzenie, o którym należy powiadomić. Na przykład w kolejce były dwa zdarzenia: żądanie ajax i żądanie HTTP. Sprawdza również, czy istnieje funkcja, która musi zostać uruchomiona na wyzwalaczu zdarzenia ... Tak więc silnik JavaScript jest powiadamiany o zdarzeniu i zna odpowiednią funkcję do wykonania na tym zdarzeniu ... Tak więc silnik JavaScript wywołuje metodę funkcja obsługi, w przykładowym przypadku np. AjaxHandler () zostanie wywołana i jak zawsze, gdy wywoływana jest funkcja, jej kontekst wykonania jest umieszczony w kontekście wykonania, a teraz kończy się wykonywanie funkcji, a żądanie ajax zdarzenia jest również usuwane z kolejki zdarzeń ... Po zakończeniu AjaxHandler () stos wykonawczy jest pusty, więc silnik ponownie patrzy na kolejkę zdarzeń i uruchamia funkcję obsługi zdarzeń dla żądania HTTP, które było następne w kolejce. Należy pamiętać, że kolejka zdarzeń jest przetwarzana tylko wtedy, gdy stos wykonania jest pusty.
Na przykład zobacz poniższy kod wyjaśniający obsługę stosu i obsługę kolejek zdarzeń przez silnik Javascript.
function waitfunction() {
var a = 5000 + new Date().getTime();
while (new Date() < a){}
console.log('waitfunction() context will be popped after this line');
}
function clickHandler() {
console.log('click event handler...');
}
document.addEventListener('click', clickHandler);
waitfunction(); //a new context for this function is created and placed on the execution stack
console.log('global context will be popped after this line');
I
<html>
<head>
</head>
<body>
<script src="program.js"></script>
</body>
</html>
Teraz uruchom stronę internetową i kliknij stronę i zobacz dane wyjściowe na konsoli. Wyjście będzie
waitfunction() context will be popped after this line
global context will be emptied after this line
click event handler...
Mechanizm JavaScript uruchamia kod synchronicznie, jak wyjaśniono w części dotyczącej kontekstu wykonania, przeglądarka asynchronicznie umieszcza elementy w kolejce zdarzeń. Tak więc funkcje, których wykonanie zajmuje bardzo dużo czasu, mogą zakłócać obsługę zdarzeń. Rzeczy, które dzieją się w przeglądarce, takie jak zdarzenia, są obsługiwane w ten sposób przez JavaScript, jeśli ma być uruchomiony detektor, silnik uruchomi go, gdy stos wykonawczy będzie pusty. Zdarzenia są przetwarzane w kolejności ich wystąpienia, więc część asynchroniczna dotyczy tego, co dzieje się poza silnikiem, tj. Co silnik powinien zrobić, gdy zdarzają się te zdarzenia zewnętrzne.
JavaScript jest więc zawsze synchroniczny.