JavaScript є однопоточним і має синхронну модель виконання. Одинарна різьба означає, що одночасно виконується одна команда. Синхронний означає один за одним, тобто виконується один рядок коду для того, щоб з'явився код. Так що в JavaScript одна справа відбувається одночасно.
Контекст виконання
Двигун JavaScript взаємодіє з іншими двигунами браузера. У стеці виконання JavaScript знаходиться глобальний контекст внизу, і тоді, коли ми викликаємо функції, механізм JavaScript створює нові контексти виконання для відповідних функцій. Коли викликана функція виходить, її контекст виконання вискакує з стека, а потім вискакується наступний контекст виконання і так далі ...
Наприклад
function abc()
{
console.log('abc');
}
function xyz()
{
abc()
console.log('xyz');
}
var one = 1;
xyz();
У наведеному вище коді буде створено глобальний контекст виконання, і в цьому контексті var oneбуде збережено і його значення буде 1 ... коли викликається виклик xyz (), тоді буде створено новий контекст виконання, і якщо ми визначили будь-яку змінну у функції xyz ці змінні зберігатимуться у контексті виконання xyz (). У функції xyz ми викликаємо abc (), а потім створюється контекст виконання abc () і ставиться у стек виконання ... Тепер, коли abc () закінчує, його контекст вискакує з стека, тоді контекст xyz () вискакує з стек і тоді глобальний контекст буде вискакуватися ...
Тепер про асинхронні зворотні дзвінки; асинхронний означає більше, ніж один.
Так само, як стек виконання, є черга подій . Коли ми хочемо отримувати сповіщення про якусь подію в механізмі JavaScript, ми можемо прослухати цю подію, і ця подія розміщується у черзі. Наприклад, подія запиту Ajax або подія HTTP-запиту.
Щоразу, коли стек виконання порожній, як показано у наведеному вище прикладі коду, JavaScript-механізм періодично переглядає чергу подій і бачить, чи існує якась подія, про яку потрібно повідомляти. Наприклад, у черзі було дві події: ajax-запит та HTTP-запит. Він також дивиться, чи є функція, яку потрібно запустити на цьому тригері події ... Отже, двигун JavaScript повідомляється про подію і знає відповідну функцію для виконання цієї події ... Отже, двигун JavaScript викликає функція обробника, у прикладі випадку, наприклад, AjaxHandler () буде викликана, і як завжди, коли функція викликається, її контекст виконання розміщується в контексті виконання, і тепер виконання функції завершується, а запит ajax події також видаляється з черги подій ... Коли AjaxHandler () закінчує стек виконання порожнім, двигун знову переглядає чергу подій і виконує функцію обробника подій HTTP-запиту, який був наступним у черзі. Важливо пам’ятати, що черга подій обробляється лише тоді, коли стек виконання порожній.
Наприклад, див. Код нижче, що пояснює виконання стека виконання та обробки черги подій за допомогою механізму 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');
І
<html>
<head>
</head>
<body>
<script src="program.js"></script>
</body>
</html>
Тепер запустіть веб-сторінку і натисніть на сторінку, і побачите вихід на консолі. Вихід буде
waitfunction() context will be popped after this line
global context will be emptied after this line
click event handler...
Двигун JavaScript виконує код синхронно, як пояснено в частині контексту виконання, браузер асинхронно ставить речі в чергу подій. Таким чином, функції, для виконання яких потрібно дуже багато часу, можуть перервати обробку подій. Речі, що відбуваються в браузері, як-от події, обробляються таким чином JavaScript, якщо є слухач, який повинен працювати, двигун запускатиме його, коли стек виконання порожній. І події обробляються в тому порядку, в якому вони відбуваються, тому асинхронна частина - це те, що відбувається поза двигуном, тобто що повинен робити двигун, коли трапляються ті зовнішні події.
Отже JavaScript завжди синхронний.